【问题标题】:Forcing all class fields be initialized强制初始化所有类字段
【发布时间】:2013-06-25 11:41:23
【问题描述】:

类似于c#中的struct,其中的所有字段都必须在编译时进行初始化,我很想知道是否有某种方法可以让程序员初始化class中的所有字段并编译代码时有指示(错误)。

祝你有美好的一天, 谢谢。

【问题讨论】:

    标签: c# class initialization field


    【解决方案1】:

    正如 NDJ 所说,提供一个将所有属性作为参数的构造函数是个好主意。

    如果您真的想在编译时收到警告或错误,以防在添加新属性后忘记更新构造函数,您可以构建自定义代码分析规则(使用 FxCop SDK)并检查每个 setter在类构造函数中调用公共属性。

    【讨论】:

      【解决方案2】:

      最简单的方法是提供一个构造函数来获取您要初始化的字段 - 例如

      public  class MyClass
      {
           public string MyValue { get; set; }
      
           public MyClass(string myValue)
           {
               MyValue = myValue;
           }
      }
      

      【讨论】:

      • 如果我以后添加一个新字段而不更新 ctor,我只会收到一个警告。
      • 那别忘了更新构造函数? (我不确定你是否会收到警告)
      • 一个警告问题是关于配置我认为的警告级别。无论如何我正在寻找另一种方式......我会说一个白痴证明方式。
      • IMO,如果您需要一种更“白痴证明”的方式来不小心将所有类字段都包含为构造函数参数,那么您的分母太低了。迎合懒惰的程序员,而不是白痴的程序员。
      • @Chris Sinclair “迎合懒惰的程序员,而不是白痴的程序员”——太好了 :)
      【解决方案3】:

      我真的看不出这有什么意义,但是:

      您已经指出结构强制执行此操作。因此,您可以通过将所有类的字段放在一个结构中来做您想做的事情。然后,如果您向结构添加新字段,它将强制您将字段初始化添加到结构的构造函数中。

      class Test
      {
          public Test(int x, string y)
          {
              fields = new Fields(x, y);
          }
      
          public int X
          {
              get
              {
                  return fields.X;
              }
      
              set
              {
                  fields.X = value;
              }
          }
      
          public string Y
          {
              get
              {
                  return fields.Y;
              }
      
              set
              {
                  fields.Y = value;
              }
          }
      
          struct Fields
          {
              public Fields(int x, string y)
              {
                  X = x;
                  Y = y;
              }
      
              public int    X;
              public string Y;
      
              // Uncomment this and you get an error:
              // public double Z;
          }
      
          Fields fields;
      }
      

      这并不是你真正想要的——因为你仍然可以在结构之外添加一个字段。所以我想它并没有太大帮助......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-29
        • 1970-01-01
        • 1970-01-01
        • 2011-03-16
        • 1970-01-01
        • 2018-04-01
        • 1970-01-01
        相关资源
        最近更新 更多