22

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

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

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

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

4

6 回答 6

30

尽管其他帖子在说什么,实际上有一种(有些不寻常的)方法可以做到这一点,并在方法中实际分配值:

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;
    }
}

示例源自这里

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

class Foo
{
    private readonly string _field;

    public Foo()
    {
        _field = GetField();
    }

    private string GetField()
    {
        return "MyFieldInitialization";
    }
}
于 2012-08-22T13:00:11.877 回答
6

Readonly field can only be assigned by the constructor. What you can do is to initialize the field with a method:

class Foo
{
    private readonly Bar _bar = InitializeBar();

    private Bar InitializeBar()
    {
        // Add whatever logic you need to obtain a Foo instance.
        return new Bar();
    }
}
于 2011-07-28T08:59:07.007 回答
4

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

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

public StuffClass(string a, char b)
   : this(a, b, 2) 
{}
于 2011-07-27T17:13:37.380 回答
1

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
    }
}

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

于 2011-07-27T17:17:21.070 回答
0

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

根据 MSDN

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

于 2011-07-27T17:13:58.747 回答
-1

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

class Foo
{
    // public readonly MyInt = 30;
    public int MyInt { get; private set; } = 30;
}
于 2018-12-14T17:44:38.317 回答