2013-03-30 15 views
5

私は、そのコンストラクタのパラメータとして値aを取るクラスを作成しようとしています。 この値を格納するprivateメンバー変数があります。その後、値を変更しないでください。プロパティのコンストラクタはコンストラクタでのみ設定できますが、どこからでも取得できますか?

はここで、それは動作しますが、私はそれがそこに最高の解決策はないと思う、私が持っているものです。

internal class Foo 
{ 
    private int a; 
    public int A 
    { 
     get 
     { 
      return this.a; 
     } 
    } 

    public Foo(int a) 
    { 
     this.a = a; 
    } 
} 

ので、この方法は、あなたがクラスの外からaにアクセスすることはできません、とだけA -property getメソッドを持っています。しかし、あなたはまだaをクラスの中から変更することができ、1つの変数だけを返すプロパティを使用し、それ以外のものは愚かではありません。

私はこの権利を行使しているのですか、これを行うには自分のコード/より適切な方法を改善する方法がありますか?

答えて

6

また、プライベートフィールドreadonlyを宣言すると、あなたはそこにいます!

public class Foo 
{ 
    public Foo(int bar) 
    { 
     this.bar = bar; 
    } 

    public int Bar 
    { 
     get 
     { 
      return bar; 
     } 
    } 
    private readonly int bar; 
} 
+1

私はすでに 'read'を知らなかったので、' const'を使ってみましたが、コンストラクタでは設定できないので、あきらめました。ニース:) –

0
internal class Foo 
{ 
    private readonly int _a; 
    public int A 
    { 
     get 
     { 
      return _a; 
     } 
    } 

    public Foo(int a) 
    { 
     _a = a; 
    } 
} 

これはそれを行う必要があります。

+2

これはOPが望むことをしません。プライベートに設定されているので、クラス内から 'A'を変更することはできます。 OPはコンストラクタから一度だけ設定したいので、 'readonly'が必要です。 – keyboardP

+0

クールに見えますが、クラス内から 'A'を変更することはできます。プロパティで 'readonly'を使用できますか? –

+0

Qは少し曖昧です。 @stakxで述べたように、値を一度割り当てる必要がある場合は 'readonly'を実装するか、外部クラスにセットを公開したくない場合は 'private set'を使用します。 –

4

「C#6以降ではyou can initialize auto-implemented properties similarly to fields」です。コンストラクタのreadonlyフィールドを初期化できるのと同じように、コンストラクタ内の取得専用の自動実装プロパティを初期化できます。このように、今、次はコンパイルされます。

public class Class1 
{ 
    public int A { get; } 
    public Class1(int a) 
    { 
     A = a; 
    } 
} 

を...と、次のエラーが得られます。

public class Class1 
{ 
    public int A { get; } 
    public Class1(int a) 
    { 
     A = a; 
    } 
    public void Mutate() 
    { 
     // Class1.cs(11,9,11,10): error CS0200: Property or indexer 'Class1.A' cannot be assigned to -- it is read only 
     A++; 
    } 
} 

私はそれを、あなたが好きな性質のインタフェース/ OOPフレンドリーで、フィールドの初期化の簡潔さを取得します。

関連する問題