プライベート変数をたくさん使って自分のウェブサイト用のクラスを作成したいのですが。
私は各変数のすべてのゲッターとセッターを書かないような解決策があると思いました、
_private int confirmed { get; set; }
_
それは正しい方法ですか?それから、クラスの外からこの値にどのようにアクセスしますか?
私は_.confirmed
_を試しましたが、それがプライベートであるというエラーが表示されます(理解しています)
しかし、意外なことに、.getConfirmed()
またはgetconfirmed()
も機能しません。
_{ get; set; }
_は暗黙的にそれらのメソッドを作成すると思いました。
誰かがこの懸念を明確にしてくれますか?
プロパティをパブリックとして宣言し、ゲッターまたはセッターを個別にプライベートとしてマークできます。
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
}
}
あなたはそれを理解する必要があります、
_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つのタイプを区別することは一般的な命名規則です。
クラスの外からこの値にアクセスするにはどうすればよいですか?
あなたできない(信頼されたコードからのリフレクションなし)。それらはprivateです。 getterを公開したいがsetterを公開したい場合は、
public int confirmed { get; private set; }
{get; set;}は暗黙的にこれらのメソッドを作成すると思いました。
できますが、設計時にはアクセスできません。
クラスの外から取得したい場合は、これを行ってください。
public int confirmed { get; set; }
またはあなたはこのルートに行くことができます:
private int confirmed;
public int Confirmed
{
get { return confirmed }
set { confirmed = value; }
}
このようなアクションを実行するには複数の方法があります。要件に応じて、以下のいずれかの方法を選択できます。
// 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;
}
}