c# - 完全初始化的类

标签 c# constructor initialization

我在类中使用 initiazling 属性 我想在完全初始化后运行验证方法。 由于显而易见的原因,我不能使用构造函数。有没有办法在某种类初始化事件中做到这一点?

var t = new Foo
              {
                foo = "";
              }

class Foo
{
   public string foo {get; set;}
   ...
   public bool validate {get ; set;}

   private void validation()
  {
     if(foo == "")
        validate = false;
     if ...
   }

}

最佳答案

(注意:为了清楚起见,我将属性重命名为 Bar,以便与类型 Foo 轻松区分)

如果 Bar 属性必须在构造时有效,为什么在构造函数中不需要它?为什么允许构造无效对象?

class Foo
{
    public Foo(string bar) {
        if(!IsValidBar(bar))
            throw new ArgumentException("bar is not valid.", "bar");
        this.Bar = bar;
    }
    public string Bar {get; set;}

    private bool IsValidBar(string bar)
    {
        // blah blah
    }
}

或者,如果您可以构造一个没有 Bar 属性值的 Foo 实例,但您不想允许设置 Bar 为无效值,您可以在 setter 中对此进行验证:

class Foo
{
    private string bar;
    public string Bar
    {
        get { return bar; }
        set
        {
            if(!IsValidBar(value))
                throw new ArgumentException("bar is not valid.", "value");
            bar = value;
        }
    }

    private bool IsValidBar(string bar)
    {
        // blah blah
    }
}

关于c# - 完全初始化的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4959034/

相关文章:

c# - 存储库模式缺少什么?你如何在现实世界中使用它?

c++ - 在从模板化中介派生的类中调用非模板基类构造函数

c++ - RAII 捕获构造函数异常的方法

c - 使用 memset 和 int 值初始化整数数组 - 失败

c# - 析构函数 - 如果应用程序崩溃,它会被调用吗

c# - 通过自定义 IContractResolver 修改/添加属性

c# - 实时跟踪启用/禁用 NLog

c++ - 派生类对象构造后调用虚函数

c++ - 静态变量声明和定义

c++ - 静态注册会导致惨败吗