如何在对象初始值设定项中分配只读成员变量?

时间:2012-02-29 11:09:12

标签: c# c#-4.0

class foo {
    public readonly int bar;
};
foo a = new foo() { bar = 123 };

error CS0191: A readonly field cannot be assigned to (except in a constructor or a variable initializer)

如何在上面的对象初始值设定项中指定bar

我是否可以初始化只读成员而无需为每个类/结构编写自定义构造函数?

6 个答案:

答案 0 :(得分:7)

foo a = new foo() { bar = 123 };

由编译器转换为

foo temp = new foo();
temp.bar = 123;
foo a = temp;

如您所见,bar的分配既不在foo构造函数中,也不在变量初始值设定项中。

所以答案是:你做不到。

答案 1 :(得分:5)

总结其他答案:错误消息没有帮助 - 对象初始值设定项不能与只读字段一起使用。

但是,具有命名参数的构造函数可以,并且这样做的语法非常相似。如此相似您甚至可能认为您已经看到了对于只读字段的C#对象初始值设定项(就像我曾经一样)当你真正看到的是这个时候:

class Foo {
    public Foo(int bar) {
        this.bar = bar;
    }
    public readonly int bar;
};

Foo a = new Foo(bar: 123);
// instead of `new Foo() { bar = 123 };`

答案 2 :(得分:1)

您在构造函数中传递值:

public class foo 
{
    public readonly int _bar;

    public foo(int bar) 
    {
        _bar = bar;
    }
};


var x = new foo(12345);

编译器告诉你的是,你可以设置readonly字段的唯一地方是在包含它的类的构造函数中,这意味着:

  • 如果您需要在对象的生命周期内进行更改,则readonly不是正确的选项
  • 如果类的每个实例都需要在readonly成员变量中保存自定义值,那么您需要将其作为构造函数的一部分注入

我建议像这样制作只读字段 public 不是一个好习惯,而只是将其公开为只有一个getter的公共属性。

答案 3 :(得分:0)

class Foo {
     private int bar;

     public Foo( int bar ){
         this.bar = bar;
     }

     public int Bar {
         get { return this.bar; }
     }
}

Foo foo = new Foo( 123 );

答案 4 :(得分:0)

你做不到。你应该使用它的构造函数。 MSDN

答案 5 :(得分:0)

你做不到。错误想告诉您可以使用

class foo {
    public readonly int bar = blabla;
};

您正在使用的对象初始化程序语法只是用于调用构造函数和分配给成员的语法糖。并且'不允许只读会员。


您需要引入一个构造函数参数,然后在构造函数中赋值。对于不可变类型,C#非常缺乏语法糖。