5

私は、それを所有するクラスに対してもプライベートであり、ゲッターとセッターのみがアクセスできるプライベートメンバー変数を作成したいと考えています。次のような自動プロパティでこれを行うことができることを私は知っています

private int MyInt{ get; set;}

しかし、ゲッターとセッターを変更できるようにしたいので、(たとえば) フィールドが何回設定されたかをログに記録できます (所有するクラスによっても)。このようなもの

private int MyInt
{
    get{ return hiddenValue; }
    set{ hiddenValue = value; Console.Out.WriteLine("MyInt has been set");}
}

ここで、「hiddenValue」は、ゲッターとセッターでのみアクセスできるメンバーです。なんで?私は偏執的な防衛プログラマーなので、自分自身を信頼していません:p。

これはC#で可能ですか? もしそうなら、構文は何ですか?

ありがとう。

4

5 に答える 5

6

あなたは本当に自分自身を信頼するべきです。

いいえ、変数を非公開にすることはできません。カプセル化するクラスでさえ、それを見ることができません。

本当にこれが必要な場合は、ネストされたクラスに値をカプセル化して、独自のプライベートをカバーできます。

class Foo 
{
    class Bar // nested
    {
        private int _value;
        public int Value 
        {
            get { return _value; }
            set { _value = value; /* logic */ }
        }
    }
}

Foo は Bar をインスタンス化し、bar.Value で取得できますが、_value には取得できません。

于 2011-08-05T04:01:17.253 に答える
4

.Net のどの言語でも使用できません。そして良いです。防御的なコーディングは良いことですが、偏執的になると、それを維持する必要がある他の開発者が狂ってしまいます。

于 2011-08-05T04:03:23.900 に答える
3

アスペクト指向プログラミング (AOP) が役立つかもしれません。一言で言えば、メソッド呼び出しの前および/または後に、選択したコードを挿入できます。

プロパティの変更を監視するために特別に設計された AOP ライブラリであるhttp://code.google.com/p/easyprop/を確認してください。自動プロパティを操作する例があります。

注: ライブラリはまだ使用していませんが、あなたの路地のすぐ上にあるように見えます。

于 2011-08-05T04:05:32.043 に答える
2

No, this isn't possible in C#.

Your best bet is probably to become less paranoid. :P

于 2011-08-05T04:00:31.310 に答える
1

あなたがやろうとしていることは、.NET では実現できません。

非表示のバッキング フィールドも IL コードで表示されます。つまり、設計時 (VS) には表示されませんが、コンパイル後に表示されます。

于 2011-08-05T04:02:27.357 に答える