1

これは、プロパティを宣言するためのコード サンプルで繰り返し見られます。 これは、匿名のプライベート バッキング フィールドを使用して自動プロパティ機能を利用していることを理解しています。

public sometype somevar {get;set;} <-- nothing happening in the getter or setter.

しかし、このような例はもう見たことがないようです。私が 2000 年代の大学にいたとき、.NET プログラミングでは、このようなものが常に使用されていました。Server、Database、User などの一連のプロパティと、ConnectionString という別のプロパティがあると考えることができる最良の例 (これは単なる例であり、このようなコードはありません)

    public string ServerName { get; set; }
    public string DatabaseName { get; set; }
    public string UserName { get; set; }



    public string ConnectionString 
    {

        get
        {
            return SomePrivateMethod(this.ServerName,this.DatabaseName,this.UserName);
        }

        set
        {
            this.ServerName = PrivateMethodThatParsesOutTheServerName(value);
            this.DatabaseName = PrivateMethodThatParsesOutTheServerName(value);
            this.UserName = PrivateMethodThatParsesOutTheServerName(value);

        }
    }

「0001020003」のような値を格納するテキスト フィールドであるストラップと呼ばれるプロパティがありますが、そのストラップ形式を解釈できないレガシー システムがあります。だから私はこれをするつもりだった

public string strap {get;set;}

public string legacyFormat {

get {
 return FormatForLegacySystem(this.strap);
}

//don't need a setter though

}

それから私は、おそらくこれは代わりに拡張機能であるべきだと思いました...

public static string AsLegacyFormat(this string value){
 //formatting code;
return fancynewformat;
}

最後の考え。この種のことは本当に私のサービス層に属していると思っていました。

public getLegacyFormat(string strap)
{
//stuff here
}

しかし、ストラップをレガシー形式で渡す必要があるときに、ストラップのすべてのインスタンスをラップする必要があるのはばかげているようです。そして、このアプローチをプロパティで使用するのは面倒です

Model.LegacyFormat = service.getLegacyFormat(Model.strap);

私のストラップに基づいて LegacyFormat は不変でなければならないので、それは悪い形のようです。

4

3 に答える 3

5

ゲッター/セッターのコードが時代遅れだとは思いません。ゲッターとセッターが有効である限り、コードを使用することをお勧めします。

  1. 小さな
  2. 副作用を起こさない
  3. 取得/設定されるプロパティに関連している

また、一部のクラスで特定の種類の動作を変更できるようにするために、仮想ゲッターとセッターを使用することもあります。

時には、やらなければならないことをやらなければならない。

于 2013-05-10T18:01:35.973 に答える
2

プロパティのゲッターとセッターの非常に重要な側面について誰も言及していないことに驚いています。それは、プロパティ値を検証できることです。

他の人の経験については知りませんが、私のクラスのプロパティの大部分はセッターで検証されています。

これには Code Contracts を使用するため、setter はしばしば を持ちContract.Requires()、getter はしばしば を持ちますContract.Ensures()

プロパティの多くは null にできないため、getter でコード コントラクトを使用してその事実を表現します。たとえば、Contract.Ensures(Contract.Result<string> != null);

したがって、ゲッターとセッターにコードを含めることは非常に重要だと思います。

于 2013-05-10T19:53:00.480 に答える
0

絶対違う!!!実際、WPF MVVM アプリケーションを使用している場合は、これを使用する必要があります。「SelectionChanged」イベントを処理するための推奨される方法は、プロパティの get/set で処理することであり、コード ビハインドを使用しないことです。

于 2013-05-10T18:39:57.297 に答える