“C# 类设计手册”(第 137 页)中的示例类不会从仅类构造函数内部为特定字段调用类验证方法。所以基本上,示例类允许您创建一个包含错误数据的对象,并且只在您调用字段的属性然后对其进行验证时才会为该数据抛出错误。所以你现在有一个坏对象,直到事后才知道。
我一直不明白为什么他们不直接从构造函数中调用属性,从而在初始化期间发现错误数据时立即抛出错误?我已经通过电子邮件发送给他们无济于事...
我倾向于通过从我的构造函数调用我的属性来使用以下格式 - 这种结构是否适合验证初始化数据?型
class Foo
{
private string _emailAddress;
public Foo(string emailAddress)
{
EmailAddress = emailAddress;
}
public string EmailAddress
{
get { return _emailAddress; }
set
{
if (!ValidEmail(value))
throw new ArgumentException
(string.Format
("Email address {0} is in wrong format",
value));
_emailAddress = value;
}
}
private static bool ValidEmail(string emailAddress)
{
return Regex.IsMatch
(emailAddress, @"\b[A-Z0-9._%+-]+" +
@"@[A-Z0-9.-]+\.[A-Z]{2,4}\b",
RegexOptions.IgnoreCase);
}
}
最佳答案
首先,您可能会遇到可怕的 NullReferenceException,因为您没有检查 emailAddress 是否在任何级别为 null。该特定检查应在构造函数本身中完成,如果 emailAddress 为空,则抛出 ArgumentNullException。至于其余的,我没有看到它有任何特别的问题,因为它写在你的样本中。但是,如果将属性设置为虚拟属性并从此类派生子项,则可能会出现一些问题。字段初始化、基类和派生类构造函数的执行顺序成为问题,您必须小心。
关于c# - 验证构造函数数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1338031/