2011-07-27 21 views
14

C#編譯器給了我下面的錯誤分配值僅由構造方法調用,

CS0191:一個只讀的字段不能被分配到(除了​​在構造函數或變量初始值)

待辦事項我必須將代碼(在我的私人函數中)移動到構造函數中?這聽起來很尷尬。

請注意,私有方法僅用於由構造函數調用。我希望有某種屬性可以用來標記相應的方法。

回答

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) 
{} 
+0

私有方法僅是爲了通過構造函數被調用。我希望有某種屬性可以用來標記相應的方法。 – tom

+0

@tom - 我不明白你對屬性的含義,但構造函數鏈接是一種慣用的C#方法來完成你所描述的內容。 –

0

如果你想修改它,你不應該讓它只讀在第一位。一旦一個變量是隻讀的,你可以根據錯誤提示

根據MSDN

readonly關鍵字是修改,你可以在字段中使用僅在構造函數中或在聲明時對其進行修改。當字段聲明包含readonly修飾符時,聲明引入的字段的賦值只能作爲聲明的一部分或在同一個類的構造函數中出現。

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

只讀字段只能由構造函數指定。你可以做的是一個方法來初始化場:

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

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

儘管其他職位在說什麼,有實際上是一個(有點不尋常)方式的方法來做到這一點,其實賦值:

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