プロパティをプライベートクラスに設定したいので、このクラスでのみこのプロパティを使用および設定できるようにする必要がある場合、より良い方法は何ですか?これ
public string Name { private get; private set }
また
private string Name { get; set }
うーん、またあります
private string Name { private get; private set }
プロパティをプライベートクラスに設定したいので、このクラスでのみこのプロパティを使用および設定できるようにする必要がある場合、より良い方法は何ですか?これ
public string Name { private get; private set }
また
private string Name { get; set }
うーん、またあります
private string Name { private get; private set }
もともと、C#ではゲッターまたはセッターに異なるアクセスを設定することはできなかったため、可能な選択肢は次のとおりでした。
public string Name { get; set; }
protected internal string Name { get; set; }
internal string Name { get; set; }
protected string Name { get; set; }
private string Name { get; set; }
(さらに言えば、自動プロパティを設定することはできず、常にバッキングフィールドとの間で書き込みを行う必要がありましたが、そのように短い例があるという理由だけで、それを無視します)。
多くの場合、2つのアクセスに異なるアクセスを設定すると便利です。ほとんどの場合、ゲッターよりも制限の厳しいセッターです。
public string Name { get; private set; }
が導入されました。
さて、それを拡張すると、次のことを可能にするのに十分論理的であるように思われます。
public string Name { private get; private set; }
private string Name { private get; private set; }
しかし、これら2つは何を表現していますか?
2つ目はそれほど悪くはありませんが、不必要に繰り返されます。それでも、混乱した考えが私たちをそこに導いた可能性は非常に高いです(おそらく不完全なリファクタリング)。優れたコードとは、コンピューターに何かを実行させることと同じくらい(どちらかといえばそうですが)、実行していることを表現することです。
したがって、そのようなものになってしまった場合は{ private get; private set; }
、もう一度見て、ここで本当に言いたいことを考える価値があるでしょう。コンパイラエラーです。
最初のケースはさらに悪いです。「このプロパティは、プライベートのセッターとプライベートのゲッターを除いて、パブリックです」と書かれています。それも例外ではなく、「いつもを除いて、これだ」というのは本当の表現ではありません。私たちにそれをさせなかったので、コンパイラーを二重に急いでください。
例をコンパイルしてみましたか?真ん中のものだけが翻訳されます。
追加のアクセシビリティレベルキーワードを指定する場合は、アクセサの1つ(ゲッター/セッター)でのみ指定できます。アクセサのそのレベルは、プロパティ全体のアクセシビリティよりも制限的である必要があります。
ここにルールがあります:アクセサのアクセシビリティの制限
public string Name { get; private set; }
これがあなたがやりたいと思っていることです。
クラスに表示させたいだけでない限り、プロパティが公開されているときにgetをプライベートにしようとしても意味がありません。そのような状況では、以下を使用する必要があります。
private string Name { get; set; }
更新:2回目の読み取りでは、間違いなく2番目の例が必要です。
より良い方法はあなたが望むものに依存します:
public string Name { private get; private set }
プロパティは、クラス自体を除いて、誰も読み取りまたは書き込みを行うことはできpublic
ません。それは完全に役に立たないので、ただ使用して
ください。private string Name { get; set }
一般に、プロパティをいくつかのメソッドのように表示する場合(実際にはそうです)
private string get_Name() { }
private string set_Name(value) { }
その識別子を物件に適用する可能性がある理由get/set
が明らかになることを願っています。
プライベートメンバーの場合、アクセサーを定義する必要はありません。これを行うだけです:
private string _name;
あなたが望むようです
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
これにより、にアクセスできるようになりますprivate string Name
。