3

アプリケーションを開発しているときに、現在はプライベートなどのプロパティが必要になることがありますが、後で新しいシナリオを処理する必要がある場合は、それをパブリックにする必要があるかもしれません。でも、そうなったとしても、セッターは非公開にしておきたいといつも思っています。次のようなコードを書きたい:

private int A
{
  get{return _a;}
  private set {_a = value;}
}

コンパイラは、セッターのアクセス修飾子はプロパティよりも制限的であるべきだと不平を言っています。セットのアクセス修飾子を削除する必要がありますが、後でプロパティを公開する必要がある場合は、そのセッターも公開します。

これはエラーではなく警告としてよかったと思いませんか?

4

5 に答える 5

4

言うコードを変更する場合は、同時にpublic言うコードを変更することもできます。private set

これが警告であることについては、ある程度の意味があることがわかります.2回指定しただけで何も機能しないとは思いませんprivate(明らかに無意味ですが)。とはいえ、私がこのコンパイラ エラーに遭遇することはめったにありません。

状況の皮肉なことに、私たちの両方が、このエラーとその影響でおそらくこれまでに経験したよりも、この質問と回答に長く費やしています:-)

于 2012-07-03T11:24:47.013 に答える
2

エラーではなく警告としてこれが良かったと思いませんか?

private int _a;いいえ、プライベート変数( )を使用し、必要な場合にのみ適切な修飾子を持つプロパティにプロモートする方がよいと思います。

もちろん、セッターがないと、次のような検証を使用することはできません。

private int _a;
public int A
{
    get { return _a; }
    private set { 

        if (value < 0 || value > 10)
        {
            throw new ArgumentOutOfRangeException("A");
        }

        _a = value; 
    }
}

しかし、その一方で、そもそも物件が公開されていることを示すのは害はありませんね。

于 2012-07-03T11:29:19.510 に答える
1

両方の修飾子を変更することは完全に有効であるため、privat セッターについてはあまり気にしません。

public int A
{
  get{return _a;}
  private set {_a = value;}
}

これは、コンパイラがプロパティを IL コードに再書き込みする方法から警告が発生したという私の推測です。プロパティは、プロパティ自体と同じ修飾子を持つ getter および setter メソッドとしてそれぞれ書き込まれます。

プライベート プロパティのプライベート セッターを定義しようとすると、次のように変換されます。

private private get_A()
{
   return _a;
}

そして、この二重化されたプライベート修飾子は明らかにコンパイルされません。

于 2012-07-03T11:35:25.213 に答える
0

あなたの例のコードは意味がありません。あなたの財産がプライベートである場合、セッターもプライベートです。セッターにアクセス修飾子を指定するだけで済みます。セッターに別のアクセス修飾子が必要な場合は、ゲッターを指定します。

于 2012-07-03T11:27:46.207 に答える
0

私はあなたが次のことをしたいと思っていると思います...

private int _a;
public int A
{
    get { return _a; }
    private set { _a = value; }
}

これにより、get アクセサーは公開されますが、set は非公開になります。

于 2012-07-03T11:32:57.823 に答える