8

VB 2010の新機能を見て、自動実装プロパティのサポートに出くわしました。

私はC#を使用しているので、これは非常に馴染みがあるように見えましたが、VBがC#に必要な機能を追加していることに気付きました。自動実装プロパティに任意のデフォルト値を設定します。

Public Class Person

    Property Name As String = "Scott Guthrie"
    Property Age as Integer = 35

End Class

私はC#での自動プロパティのクリーンな使用法が本当に好きです。これにより、デフォルト値が必要になるたびにバッキングフィールドを導入してプロパティに接続する手間が省け、コードが不必要に乱雑になります。

なぜこれがC#でも導入されなかったのか疑問に思いましたか?これを行わない理由は何でしょうか?構文の議論が進行中ですか、それともこれを実装するのに技術的な制限がありますか?

4

4 に答える 4

9

コンストラクターでそれらをデフォルトにしないのはなぜですか?それもそのためです。

于 2010-04-13T08:23:30.877 に答える
4

どうですか:

public class Person
{
    public Person() 
    {
         this.Name = "Scott Guthrie";
         this.Age = 35;
    }
    public string Name { get; set; }
    public string Age { get; set; }
}

実際には、それは同じことであり、それほど余分な作業ではないと私は信じています。しかし、おそらく、長い間、VBはC#よりも明確に見えます... ;-)

編集(合理的):
あなたは、元の質問の下(およびその中)の最後のコメントで理論的根拠を求めていました。大声で考えると、初期化コードは1つの場所にのみ移動するというC#の原則、つまりコンストラクターがこの決定の理由だと思います。初期化コードを探す必要がある場所をもう1つ追加すると、デバッグが難しくなり、コードがわかりにくくなります。

明らかに、インライン初期化値に他の初期化または計算を含めることはできません(少なくとも非常に制限されています)。VBの方が簡潔であることに同意しますが、C#チームとAnders Hejlsbergが、初期化のために1つの場所を用意することがより大きな利点であると考えている場合は理解できます。

編集: これはマイクロソフトがそれについて言っていることです。要するに、C#4.0ではなく、おそらくC#5.0ですか?また:

「しかし、思ったほど簡単ではありません。次に必要なのは、コンストラクターがバッキングフィールドを初期化することですが、それはセッターを介してのみ実行できます。これは、希望どおりではない可能性があります。」

および(コメント投稿者のみ):

「初期化またはコンストラクター制御がないため、参照型を返すプロパティにとってこの機能は実質的に価値がありません。」

于 2010-04-13T08:27:28.950 に答える
0

私はマイクロソフトではありませんが、認識されているメリットは、機能の実装、テスト、およびサポートにかかるコストよりも少ないことをお勧めします。

もちろん、コンストラクターを宣言することでデフォルト値を設定することもできますが、VB構文が少し明確になることに同意します(特に、などのメタデータで装飾する場合<DefaultValue(...)>

于 2010-04-13T08:24:38.457 に答える
0

自動プロパティをバッキングフィールドのあるプロパティに変換するという面倒なビジネスの解決策があります。私のアドインであるAtomineerUtilsは、キーを1回押すだけでリファクタリングを実行します。

于 2010-04-13T08:35:05.317 に答える