2016-08-30 5 views
1

実行プログラム中に変更されていない情報があります。これは静的情報の一種です。残念ながら、プログラムの実行中に、私は、このようなstaticメンバーのフィールドを変更することができます読み取り専用不変参照の宣言方法は?

public class Foo 
{ 
    public static readonly List<int> = new List<int> { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 }; 
}; 

:私は、次のコードを使用しています。結果として、私は次の警告を受けます:

"読み取り専用の可変参照型を宣言しないでください"。

この問題に対処するベストプラクティスは何ですか?

+0

は 'TypeFace'です自分のクラスですか?もしそうなら、あなたはそれを不変にすることができますか( '' CultureInfo'のように) "オプションで不変"にすることができますか?一般的に、私はフィールド、btwよりプロパティを公開することをお勧めします...と、.NETの命名規則に従って。 –

+0

@Jon Skeet、それはシステムクラスです。どのように私はそれを不変にすることができますか? – LmTinyToon

+1

一見すると、それは既に不変に見えます。どのプロパティを変更できますか? –

答えて

3

C#では、他の誰かのクラスのメンバを不変にすることはできません。私はconstリファレンスのC + +の概念に精通していると思いますが、C#にはそういうものはありません。

アクセスを制御したい場合は、書体を非公開にし、読み込み専用の静的プロパティとメソッドをFooに追加します。つまり、次のような読み取り専用アクセス権を得ることができます。

Foo.TypeFaceSize; 
Foo.TypeFaceName; 
+0

私が理解したように、このフィールドの可能な変更をチェックするコード契約を使用する唯一の方法はありますか? – LmTinyToon

+1

私はそれを試していない - 私はあなたが成功するかどうかを知ることに興味があります。 TypeFaceは現実には変更不可能ですが、コンパイラはそれを知らないようです - コードで警告を抑えることを検討します - https://msdn.microsoft.com/en-us/library/ms244717.aspx –

1

C#コンパイラは、プロパティまたはフィールドへの読み取り専用アクセスのみを強制できます。フィールドを読み取り専用にすると、このフィールドのオブジェクトの設定可能なプロパティは設定可能なままであり、変更できる唯一の方法はオブジェクトのクラス定義を変更することです。

独自のカスタムクラスでオブジェクトをラップし、ゲッターだけを許可することができます。しかし、ラッパーのいくつかの層を持つ必要があるかもしれないので、私はそれをやっておらず、コンパイラの警告に注意を払うことをお勧めします。

1

C#では、可変型を不変型にすることはできません。です。あなたは不変タイプのようなTypeFaceを公開したい場合は

あなたは同じ性質を持っているタイプとにそれをラップすることができますが、読み取り専用プロパティとして、それらを公開します。

public class A 
{ 
    public string Text { get; set; } 
} 

public class AReadOnly 
{ 
    public AReadOnly(A a) 
    { 
     A = a; 
    } 

    private A A { get; } 

    public string Text => A.Text; 
} 

public class B 
{ 
    public B() 
    { 
     A = new AReadOnly(_A); 
    } 

    private A _A { get; } = new A(); 
    public AReadOnly A { get; } 
} 
関連する問題