在仅由构造函数调用的私有方法中赋值readonly变量

时间:2011-07-27 17:12:03

标签: c# readonly private-methods

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

CS0191:无法分配只读字段(构造函数或变量初始值设定项除外)

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

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

6 个答案:

答案 0 :(得分:22)

尽管其他帖子说的是, 实际上是一种(有点不寻常)的方法,并且实际上在方法中分配了值:

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

答案 1 :(得分: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) 
{}

答案 2 :(得分:4)

Readonly字段只能由构造函数指定。你可以做的是用一个方法初始化字段:

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

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

答案 3 :(得分: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类之外的其他类”时,您可以使用const替代string关键字,因为编译器不允许您分配const一个班级。

答案 4 :(得分:0)

如果你想修改它,你不应该只是首先阅读它。只读变量后,您只能在构造函数中或在声明时修改它,如错误所示

根据MSDN

  

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

答案 5 :(得分:-1)

您可以在只读声明中的每个等号前面直接粘贴“ {get; private set;}”,以实现几乎相同的效果(现在不仅可以在构造函数中,而且可以至少在其构造函数中,在类的任何位置设置属性,在课外无法更改)。对于值类型严格来说是这样,但对于只读可能具有优势的引用类型却不是。

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