5

重複の可能性:
プロパティを介して同じクラス内の変数にアクセスする必要がありますか?

私は最近これに遭遇し、クラス内で参照する必要のある標準があるかどうかに興味がありました。

メンバー変数に直接アクセスするか、プロパティを通過するか(カスタムセッターコードをかわす必要がない限り)は実際には違いはありませんが、ベストプラクティスがないことを確認したかったのです。

partial class MyClass {
    private string foo;

    internal string Foo {
        get {
            return foo;
        }

        private set {
            foo=value;
            // I do other stuff
        }
    }

    public void DoSomething() {
        //Option 1;
        Foo="some string";

        //Option 2;
        foo="some string";
    }
}
4

8 に答える 8

3

これはあなたが実際に行う選択ではありません。セッター内のコードが実行されることになっている場合はプロパティを使用するか、実行しない場合はメンバー変数を使用します。ほとんどすべての状況で、1つは正しく、もう1つは間違っています。一般的なケースでは、どちらも常に正しい/間違っているわけではなく、「問題ではない」ことは珍しいことです。

たとえば、セッターコードが「変更された」イベントを発生させている場合、変更されたことを外部オブジェクトに通知する必要がありますか?以前の変更に応じて変更する場合は、おそらく変更しないでください(無限再帰はありませんか?)。いいえの場合は、確実に実行されるようにする必要があります(値を変更せず、変更を通知しないようにするため)。

設定されている値が有効であることを検証しているだけの場合は、このコンテキストでは、値がすでに検証されており、有効である必要があることを知っています。この場合、再度検証する必要はありません。プロパティを設定します。設定しようとしているものをまだ検証していない場合は、検証ロジックを実行する必要があるため、プロパティを使用します

于 2013-01-23T18:03:59.453 に答える
2

この質問は非常に多くの議論がなされているので、質問に対する明確な答えはありません。

個人的には、検証コードや変換コードが含まれている可能性があるため、プロパティを介してアクセスすることを好みます。ゲッターとセッターは些細なことですが、将来変更される可能性があります。

于 2013-01-23T17:54:52.233 に答える
1

fooフィールドをプロパティでラップした場合はFoo、おそらく理由(変換、イベント、検証など)でラップしました。したがって、一般的に言えば、フィールドを参照する必要があるのfooは、プロパティのゲッターとセッターだけですFoo。コードの残りの部分は、プロパティを参照する必要がありますFoo

プロパティのゲッターとセッターをバイパスする必要があるというあいまいな状況が存在すると確信しています。それは確かに問題ありませんが、そのような状況はルールの例外になります。

于 2013-01-23T18:01:50.000 に答える
0

オプション1は良い習慣です。オプション2を使用すると、foo値を設定するときに他のものが失われるためです。

于 2013-01-23T17:52:54.483 に答える
0

オプション1を使用します。変数を設定する場合は、変数に直接アクセスするのではなく、プロパティを使用する必要があります。これは、プロパティに「//他のことをします」で指定した追加のコードがあるためです。プロパティを設定しなかったという理由だけで、この「その他の作業」を繰り返す必要はありません...今回設定するときに「その他の作業」を実行したくない場合を除きます。

正直なところ、これは単なる理論上の状況であり、この問題が発生する実際的な状況を提示すると、答えるのがはるかに簡単になります。

于 2013-01-23T17:59:39.080 に答える
0

INotifyPropertyChangedインターフェイスを使用する場合、バインドされたオブジェクトを更新する場合は、プロパティを使用する必要があります。

于 2013-01-23T18:19:38.143 に答える
0

セッターにロジックがない場合は、プライベート変数を明示的に宣言しても意味がないため、自動実装されたプロパティを使用することをお勧めします。

    internal string Foo
    {
        get;
        private set;
    }

    public void DoSomething()
    {
        this.Foo = "some string";
    }

セッターにロジックがある場合、プライベート変数はセッター内でのみ使用する必要があり、セッターの外部で変更することはできません。いずれにせよ(そして私の意見では:))プライベート変数はプロパティセッター以外のどこにも表示されるべきではありません。

于 2013-01-23T18:26:59.670 に答える
0

次のようなコードを想像してみてください

public partial class HybridPanel: Panel {
    [DefaultValue(BorderStyle.FixedSingle)]
    public virtual new BorderStyle BorderStyle {
        set {
            if(value!=borderStyle) {
                borderStyle=value;
                base.PerformLayout();
            }
        }

        get {
            try {
                return borderStyle;
            }
            finally {
                if(borderStyle!=base.BorderStyle)
                    base.PerformLayout();
            }
        }
    }

    BorderStyle borderStyle=BorderStyle.FixedSingle;
    bool isCollapsed, isAutoSize;
}

このconextでは、プロパティは変数としてだけでなく、他のことも行うために使用されます。同じクラスのプロパティにアクセスすることは悪い習慣とは見なされません。さらに、コンパイラは次のことを示唆します。

引数を渡さずにフィールドにアクセスするためだけのメソッド。代わりに、プロパティとして定義することを検討してください。

ちなみに、メンバー変数ディレクトリへのアクセスの説明を修正して、メンバー変数に直接アクセスする(つまり、フィールドを使用してアクセスする)ことができます。

于 2013-01-23T18:31:53.440 に答える