c# - 验证构造函数数据

标签 c# class-design structure

“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/

相关文章:

c# - 'OFFSET' 附近的语法不正确。 FETCH 语句中 NEXT 选项的无效使用 "in Entity Framework core"

java - java中如何解耦数据和行为对象?

oop - "is A"VS "is Like A"关系,每一个的含义是什么以及它们有何不同?

java - 多级继承中的多个抽象类

c - 删除C编程中的所有结构条目

c# - 从 C# 到 C++ 的数组再返回,没有不安全的代码

c# - 如何获取当前的 Active Solution Platform 名称以用于 Visual Studio 加载项? (C#)

c# - 使用多个类时,通常处理 Try/Catch block 和错误的正确方法是什么?

c++ - 在 C++ 中使用带有指针结构的 beginthread

c# - 如何实现一对多关系