因此,我有一个非常简单的类,其中一个字符串作为属性。该字符串必须具有特定的模式。我正在尝试使用代码合同来强制执行此操作。该类如下所示:

class SimpleClass
{
    public Property { get; set; }

    public SimpleClass(string prop)
    {
      Contract.Requires(IsValid(prop));
      this.Property = prop;
    }

    [ContractInvariantMethod]
    void ObjectInvariant()
    {
      Contract.Invariant(IsValid(Property));
    }

    bool IsValid(string arg)
    {
      // Use regex to check if arg is a valid string
    }
}


非常简单。但是,这引发了一个无法读取的异常,另一个说法是“成员SimpleClass.IsValid的可见性比封闭方法SimpleClass。#ctor(System.String)”低。为什么这是非法的?我应该将正则表达式复制/粘贴到这两种方法中吗?这似乎是对的权利。请帮我理解!

最佳答案

另一种方法是避免“原始痴迷”,并使用适合您目的的类,例如:

public SimpleClass(Email address)
{
    // no need to check, it must be valid :)
}


...,然后将所有验证逻辑封装在Email类中。您仍然会遇到有关验证的“字符串格式”问题,但是我认为对此更好的习惯用法是创建一个名为Email.TryParse的方法,并沿int.TryParse的方式进行格式化。

10-01 23:18