【问题标题】:assign value of readonly variable in private method called only by constructors在仅由构造函数调用的私有方法中分配只读变量的值
【发布时间】:2011-07-27 17:12:03
【问题描述】:

C# 编译器给了我以下错误

CS0191:无法将只读字段分配给(在构造函数或变量初始化程序中除外)

我是否必须将代码(在我的私有函数中)移动到构造函数中?这听起来很尴尬。

请注意,私有方法仅供构造函数调用。我希望有某种属性可以用来标记相应的方法。

【问题讨论】:

    标签: c# readonly private-methods


    【解决方案1】:

    尽管其他帖子在说什么,实际上是一种(有点不寻常的)方法来执行此操作并实际在方法中分配值:

    public class Foo
    {
        private readonly string _field;
    
        public Foo(string field)
        {
            Init(out _field, field);
        }
    
        private static void Init(out string assignTo, string value)
        {
            assignTo = value;
        }
    }
    

    源自here 的示例。

    或者,您也可以从私有方法返回值并在构造函数中分配它,如下所示:

    class Foo
    {
        private readonly string _field;
    
        public Foo()
        {
            _field = GetField();
        }
    
        private string GetField()
        {
            return "MyFieldInitialization";
        }
    }
    

    【讨论】:

    • 这是最接近 op 问题的解决方案。虽然,按照我对他的要求的理解,他希望该方法只能由构造函数“调用”。然而,据我所知,这还不可能。
    【解决方案2】:

    只读字段只能由构造函数赋值。您可以做的是使用方法初始化字段:

    class Foo
    {
        private readonly Bar _bar = InitializeBar();
    
        private Bar InitializeBar()
        {
            // Add whatever logic you need to obtain a Foo instance.
            return new Bar();
        }
    }
    

    【讨论】:

      【解决方案3】:

      是的。您是否尝试过将构造函数链接作为使用通用方法的替代方法?

      public StuffClass(string a, char b, int c)
      {
          _a = a;
          _b = b;
          _c = c;
      }
      
      public StuffClass(string a, char b)
         : this(a, b, 2) 
      {}
      

      【讨论】:

      • 私有方法仅供构造函数调用。我希望有某种属性可以用来标记相应的方法。
      • @tom - 我不明白你对属性的意思,但构造函数链接是一种惯用的 C# 方式来做你所描述的事情。
      【解决方案4】:

      readonly 成员只能在类级别或其构造函数中赋值。这就是使用readonly 关键字的好处。

      class Foo
      {
          private readonly Foo _foo = new Foo(); // Valid
      
          public Foo()
          {
              _foo = new Foo(); // Valid
          }
      
          private void SomeMethod()
          {
              _foo = new Foo(); // Not valid
          }
      }
      

      当使用“string 类以外的类”时,您可以使用 readonly 替代 const 关键字,因为编译器不允许您将 const 分配给类。

      【讨论】:

        【解决方案5】:

        如果你想修改它,你首先不应该让它只读。一旦变量是只读的,您只能在构造函数或声明时修改它,如错误提示

        根据 MSDN

        readonly 关键字是可用于字段的修饰符。当字段声明包含 readonly 修饰符时,对声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中发生。

        【讨论】:

          【解决方案6】:

          您可以在只读声明中的每个等号前面直接粘贴“{ get; private set; }”以实现几乎相同的目的(现在可以在类中的任何位置设置属性,不仅在构造函数中,而且至少在它的课外不可更改)。这对于值类型是绝对正确的,但对于 readonly 可能具有优势的引用类型则不然。

          class Foo
          {
              // public readonly MyInt = 30;
              public int MyInt { get; private set; } = 30;
          }
          

          【讨论】:

          • 这是一个很好的提示,但不是 op 要求的。
          猜你喜欢
          • 2017-10-29
          • 1970-01-01
          • 2019-02-25
          • 2014-10-16
          • 1970-01-01
          • 2013-05-16
          • 1970-01-01
          • 2011-03-18
          • 2014-06-08
          相关资源
          最近更新 更多