web-dev-qa-db-ja.com

{get;を使用してプライベート変数にアクセスする方法セットする; }

プライベート変数をたくさん使って自分のウェブサイト用のクラスを作成したいのですが。

私は各変数のすべてのゲッターとセッターを書かないような解決策があると思いました、

_private int confirmed { get; set; }
_

それは正しい方法ですか?それから、クラスの外からこの値にどのようにアクセスしますか?

私は_.confirmed_を試しましたが、それがプライベートであるというエラーが表示されます(理解しています)

しかし、意外なことに、.getConfirmed()またはgetconfirmed()も機能しません。

_{ get; set; }_は暗黙的にそれらのメソッドを作成すると思いました。

誰かがこの懸念を明確にしてくれますか?

12
Krowar

プロパティをパブリックとして宣言し、ゲッターまたはセッターを個別にプライベートとしてマークできます。

public int confirmed { get; private set; }

そうすれば、定義したクラスの外でconfirmedにアクセスできます。

Console.WriteLine(myClass.confirmed); // This is OK
myClass.confirmed = "Nothing"; // Can't do this

そして、confirmedの値を設定できるのはMyClassだけです。

public class MyClass {
    public int confirmed { get; private set; }

    public MyClass() {
        this.confirmed = "This"; // This is fine as we have private access
    }
}
17
CodingIntrigue

あなたはそれを理解する必要があります、

_private int confirmed { get; set; }
_

privateバッキングフィールドを持つprivateメソッドのセットに展開され、

_private int _confirmed;

private int confirmed_get() 
{ 
    return this._confirmed; 
}

private void confirmed_set(int value) 
{ 
    this._confirmed = value; 
}
_

したがって、プロパティprivateをマークすると、アクセサーとミューテーターの両方がプライベートになり、クラスの外部からアクセスできないのはこのためです。また、これらのメソッドにはコンパイル時にアクセスできないため、instance.confirmed_get()の呼び出しは許可されていません。プロパティの読み取りと書き込みの両方に_instance.confimed_のみを使用できます。

あなたが望むかもしれないのは、それをpublicと宣言することです、

_public int confirmed { get; set; }
_

動作は似ていますが(フィールドはprivateのままです)、両方のメソッドがpublicになりました。他の人が言及しているように、getまたはsetタイプの動作のreadonlyおよびwriteonlyを個別に変更できます。

_public int confirmed { get; private/protected set; }
_

または

_public int confirmed { private/protected get; set; }
_

最後に、キャメルケースをプロパティに使用する習慣を身に付ける必要があります。 Confirmedおよびフィールドのキャメル小文字。 confirmed(__confirmed_を実行する人もいます)。特にクラスの消費者にとって、2つのタイプを区別することは一般的な命名規則です。

4
rae1

クラスの外からこの値にアクセスするにはどうすればよいですか?

あなたできない(信頼されたコードからのリフレクションなし)。それらはprivateです。 getterを公開したいがsetterを公開したい場合は、

public int confirmed { get; private set; }

{get; set;}は暗黙的にこれらのメソッドを作成すると思いました。

できますが、設計時にはアクセスできません。

3
D Stanley

クラスの外から取得したい場合は、これを行ってください。

    public int confirmed { get; set; }

またはあなたはこのルートに行くことができます:

    private int confirmed;

    public int Confirmed 
    {
        get { return confirmed }
        set { confirmed = value; }
    }
2

このようなアクションを実行するには複数の方法があります。要件に応じて、以下のいずれかの方法を選択できます。

    // Old Conventional - Statement body
    public class SampleClass1
    {
        public bool CanAccessFromOutside
        {
            get { return _cannotAccessFromOutside; }
        }

        private bool _cannotAccessFromOutside;

        private void DoSomething()
        {
            _cannotAccessFromOutside = true;
        }
    }


    // Expression Bodied Property
    public class SampleClass2
    {
        public bool CanAccessFromOutside => _cannotAccessFromOutside;

        private bool _cannotAccessFromOutside;

        private void DoSomething()
        {
            _cannotAccessFromOutside = true;
        }
    }

    // Auto Property
    public class SampleClass3
    {
        public bool CanAccessFromOutside { get; private set; }

        private void DoSomething()
        {
            CanAccessedFromOutside = true;
        }
    }
1
singhsac