2011-07-27 5 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 
    } 
} 

クラスを使用する場合、コンパイラは、あなたがクラスにconstを割り当てることができませんので、あなたは、「stringクラス、他の」constキーワードの代わりとしてreadonlyを使用することができます。

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