取得 - c# 属性 継承
C#3.0の自動プロパティ-便利かどうか? (12)
注:これは私がC#を始めたときに投稿されました。 2014年の知識では、自動プロパティはC#言語でこれまでに起こった中で最高のものの1つです。
私はC#でプライベートフィールドとパブリックフィールドを使って自分のプロパティを作成するのに慣れています。
private string title;
public string Title
{
get { return title; }
set { title = value; }
}
さて、 .NET 3.0では、自動プロパティを取得しました。
public string Title { get; set; }
私はこれがより哲学的/主観的な質問であることを知っていますが、各フィールドに5行のコードを保存する以外にこれらの自動プロパティを使用する理由はありますか? 私の個人的な不満は、それらの特性が私からものを隠しているということです、そして私は黒魔術の大ファンではありません。
実際、隠しプライベートフィールドはデバッガにも表示されません。get / set関数は何もしないという事実を考えると、問題ありません。 しかし、実際にゲッター/セッターロジックを実装したい場合は、とにかくプライベート/パブリックのペアを使用する必要があります。
後でgetter / setterロジックを変更する機能を失うことなく多くのコード(1行と6行)を節約できるという利点がありますが、その場合も、パブリックフィールド「Public string Title」を宣言せずにすでに実行できます。 {get;の必要性 セット; これにより、さらに多くのコードを節約できます。
だから、私はここで何が足りないのですか? なぜ誰かが実際に自動プロパティを使用したいのですか?
@ドメニコ:私はそれを取得できません..あなたは自動プロパティでこれを行うことはできませんか?
public string Title { get; }
または
public string Title { get; private set; }
これはあなたが言及しているものですか?
C ++の作成者であるBjarne Stroustrupから:
私は特にgetやset関数がたくさんあるクラスが嫌いです。 それは多くの場合、それがそもそもクラスではないはずだったことを示しています。 それは単なるデータ構造です。 そしてそれが本当にデータ構造であれば、それをデータ構造にします。
そして、あなたは何を知っていますか? 彼は正しいです。 実際にはget / set内で何もしないで、単純に取得および設定でプライベートフィールドをラップするのはどのくらいの頻度で行われますか。それは、単に「オブジェクト指向」のことだからです。 これは、この問題に対するマイクロソフトの解決策です。 それらは基本的にあなたがバインドできるパブリックフィールドです。
ここで注意すべきことは、私の理解するところでは、これはC#3.0側の 単なる 構文上の糖であり、コンパイラによって生成されたILが同じであることを意味します。 私は黒魔術を避けることについては同意しますが、同じこと、同じことをするにも同じこと、少ない行数が通常は良いことです。
それは簡単で、短くて、プロパティの本体の内側のどこかに実際の実装を作りたいのであれば、それはあなたの型の外部インターフェースを壊すことはありません。
それと同じくらい簡単です。
インターフェイス定義ではプロパティを使用できますが、インターフェイス定義ではパブリックフィールドを使用できないため、パブリックフィールドではなくプロパティを常に作成します。
コードスニペットの場合、同じ名前の自動プロパティは合計7回のキーストロークになります。
直感的でANDコードの行数を減らすような構造は、大きな利点だと思います。
そのような種類の機能は、Rubyのような言語を非常に強力にするものです(それと動的な機能は、余分なコードを減らすのにも役立ちます)。
Rubyはこれまでずっと次のようにしてきました。
attr_accessor :my_property
attr_reader :my_getter
attr_writer :my_setter
私が彼らと一緒に抱えている唯一の問題は、彼らが十分に行かないということです。 自動プロパティを追加したコンパイラの同じリリースに、部分メソッドを追加しました。 なぜ彼らが2つをまとめなかったのかは私を超えています。 単純な「部分的な<PropertyName>が変更されました」とすると、これらは本当に便利になります。
私の意見では、あなたは常にパブリックフィールドの代わりに自動プロパティを使うべきです。 それは言った、これは妥協です:
プロパティに使用する命名規則を使用して internal フィールドから始めます。 どちらか最初に
- アセンブリの外側からフィールドにアクセスする必要がある、または
- ゲッター/セッターにロジックをアタッチする必要がある
これを行う:
- フィールド名を変更
- プライベートにする
- 公共施設を追加する
クライアントコードを変更する必要はありません。
しかし、いつの日か、あなたのシステムは成長し、あなたはそれを別々のアセンブリと複数のソリューションに分解するでしょう。 Jeffが述べたように 、パブリックフィールドをパブリックプロパティに変更することはAPIの重大な変更である ため、それが起こると、公開されたフィールドはあなたを悩ませます。
私はCodeRushを使っています。自動プロパティよりも速いです。
これをする:
private string title;
public string Title
{
get { return title; }
set { title = value; }
}
合計8回のキーストロークが必要です。
私は個人的にはオートプロパティが大好きです。 コード行を保存することの何が問題になっていますか? ゲッターやセッターで何かしたいのなら、後でそれらを通常のプロパティに変換しても問題ありません。
あなたが言ったようにあなたはフィールドを使うことができ、そしてあなたが後でそれらにロジックを追加したければあなたはそれらをプロパティに変換するでしょう。 しかし、これはリフレクションを使用した場合(そしておそらく他の場所でも)問題を引き起こす可能性があります。
また、プロパティを使用すると、フィールドでは実行できないゲッターとセッターに異なるアクセスレベルを設定できます。
varキーワードと同じだと思います。 個人的な好みの問題
自動プロパティはC#のものと同じくらい黒い魔術です。 最初に通常のC#プロパティに拡張されるのではなく、ILにコンパイルするという観点から考えると、他の多くの言語構成よりもはるかに黒魔術ではありません。