5

aコンストラクターのパラメーターとして値を取るクラスを作成しようとしています。この値を格納するプライベート メンバー変数があります。後で値を変更しないでください。

これが私が持っているものです、それは機能しますが、それが最善の解決策だとは思いません:

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 つの変数のみを返すプロパティを使用すると、それ以外は馬鹿げたものにはなりません。

私はこれを正しく行っていますか、またはコードを改善する方法/これを行うためのより適切な方法はありますか?

4

3 に答える 3

6

さらに、private フィールドreadonlyを宣言すれば完了です。

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

    public int Bar
    {
        get
        {
            return bar;
        }
    }
    private readonly int bar;
}
于 2013-03-30T15:41:07.937 に答える
5

「C# 6 以降では、自動実装されたプロパティをフィールドと同様に初期化できます」. コンストラクターでフィールドを初期化できるよう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 フレンドリーでフィールド初期化の簡潔さを得ることができます。

于 2015-07-23T14:40:27.640 に答える
0
internal class Foo
{
    private readonly int _a;
    public int A 
    { 
        get
        {
            return _a;
        }
    }

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

これでうまくいくはずです。

于 2013-03-30T15:42:38.553 に答える