5

プロパティをプライベートクラスに設定したいので、このクラスでのみこのプロパティを使用および設定できるようにする必要がある場合、より良い方法は何ですか?これ

public string Name { private get; private set }

また

private string Name { get; set }

うーん、またあります

private string Name { private get; private set }
4

6 に答える 6

17

もともと、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; }、もう一度見て、ここで本当に言いたいことを考える価値があるでしょう。コンパイラエラーです。

最初のケースはさらに悪いです。「このプロパティは、プライベートのセッターとプライベートのゲッターを除いて、パブリックです」と書かれています。それも例外ではなく、「いつもを除いて、これだ」というのは本当の表現ではありません。私たちにそれをさせなかったので、コンパイラーを二重に急いでください。

于 2012-09-03T19:38:43.267 に答える
9

例をコンパイルしてみましたか?真ん中のものだけが翻訳されます。

追加のアクセシビリティレベルキーワードを指定する場合は、アクセサの1つ(ゲッター/セッター)でのみ指定できます。アクセサのそのレベルは、プロパティ全体のアクセシビリティよりも制限的である必要があります。

ここにルールがあります:アクセサのアクセシビリティの制限

于 2012-09-03T19:02:10.943 に答える
1
public string Name { get; private set; }

これがあなたがやりたいと思っていることです。

クラスに表示させたいだけでない限り、プロパティが公開されているときにgetをプライベートにしようとしても意味がありません。そのような状況では、以下を使用する必要があります。

private string Name { get; set; }

更新:2回目の読み取りでは、間違いなく2番目の例が必要です。

于 2012-09-03T18:58:31.150 に答える
0

より良い方法はあなたが望むものに依存します:

public string Name { private get; private set }プロパティは、クラス自体を除いて、も読み取りまたは書き込みを行うことはできpublicません。それは完全に役に立たないので、ただ使用して ください。private string Name { get; set }

一般に、プロパティをいくつかのメソッドのように表示する場合(実際にはそうです)

private string get_Name() {  }

private string set_Name(value) {  }

その識別子を物件に適用する可能性がある理由get/setが明らかになることを願っています。

于 2012-09-03T18:57:56.420 に答える
0

プライベートメンバーの場合、アクセサーを定義する必要はありません。これを行うだけです:

private string _name;
于 2015-02-05T14:58:10.503 に答える
0

あなたが望むようです

private string name;

public string Name

{

    get { return name; }

    set { name = value; }

}

これにより、にアクセスできるようになりますprivate string Name

于 2019-11-06T23:28:58.403 に答える