【发布时间】:2011-07-27 17:12:03
【问题描述】:
C# 编译器给了我以下错误
CS0191:无法将只读字段分配给(在构造函数或变量初始化程序中除外)
我是否必须将代码(在我的私有函数中)移动到构造函数中?这听起来很尴尬。
请注意,私有方法仅供构造函数调用。我希望有某种属性可以用来标记相应的方法。
【问题讨论】:
标签: c# readonly private-methods
C# 编译器给了我以下错误
CS0191:无法将只读字段分配给(在构造函数或变量初始化程序中除外)
我是否必须将代码(在我的私有函数中)移动到构造函数中?这听起来很尴尬。
请注意,私有方法仅供构造函数调用。我希望有某种属性可以用来标记相应的方法。
【问题讨论】:
标签: c# readonly private-methods
尽管其他帖子在说什么,有实际上是一种(有点不寻常的)方法来执行此操作并实际在方法中分配值:
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";
}
}
【讨论】:
只读字段只能由构造函数赋值。您可以做的是使用方法初始化字段:
class Foo
{
private readonly Bar _bar = InitializeBar();
private Bar InitializeBar()
{
// Add whatever logic you need to obtain a Foo instance.
return new Bar();
}
}
【讨论】:
是的。您是否尝试过将构造函数链接作为使用通用方法的替代方法?
public StuffClass(string a, char b, int c)
{
_a = a;
_b = b;
_c = c;
}
public StuffClass(string a, char b)
: this(a, b, 2)
{}
【讨论】:
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 分配给类。
【讨论】:
如果你想修改它,你首先不应该让它只读。一旦变量是只读的,您只能在构造函数或声明时修改它,如错误提示
根据 MSDN
readonly关键字是可用于字段的修饰符。当字段声明包含readonly修饰符时,对声明引入的字段的赋值只能作为声明的一部分或在同一类的构造函数中发生。
【讨论】:
您可以在只读声明中的每个等号前面直接粘贴“{ get; private set; }”以实现几乎相同的目的(现在可以在类中的任何位置设置属性,不仅在构造函数中,而且至少在它的课外不可更改)。这对于值类型是绝对正确的,但对于 readonly 可能具有优势的引用类型则不然。
class Foo
{
// public readonly MyInt = 30;
public int MyInt { get; private set; } = 30;
}
【讨论】: