2009-12-02 5 views
10

私の質問は単純ですが、getterとsetterメソッドを書くよりも、C#のget setプロパティを使って良いと思っています。これらのプロパティを使用する場合、クラスデータメンバーをpublicとして宣言する必要はありませんか?私の教授は、データのメンバーはは決してと宣言しなければならないと述べたので、これは尋ねます。C#のget setプロパティを使用しているのが良い方法ですか?

この....

class GetSetExample 
{ 
    public int someInt { get; set; } 
} 

この...

class NonGetSetExample 
{ 
    private int someInt; 
} 

編集:あなたのすべてに

ありがとう!あなたの答えはすべて私を助けてくれました。私はあなたの答えを適切に投票しました。

+0

これは実際に私たちが新しいアプリケーションにインタビューするときに尋ねるものです。なぜあなたは最初のものを2番目に使うのでしょうか:-) –

+0

教授は、絶対的なものを使わないことを知るには十分スマートでなければなりません!彼が「決して理解できない可能性のある結果を受け入れることなく」という意味に「決して」再定義しない限り... –

答えて

14

この:

class GetSetExample 
{ 
    public int someInt { get; set; } 
} 

が本当にこれと同じである:

class GetSetExample 
{ 
    private int _someInt; 
    public int someInt { 
     get { return _someInt; } 
     set { _someInt = value; } 
    } 
} 

get; set;構文はゲッターとセッターを行わないときに使用することができ、このためだけの便利な省略形ですなにか特別なもの。

したがって、パブリックメンバーを公開していないため、プライベートメンバーを定義し、そのメンバーにアクセスするためのget/setメソッドを提供しています。

4

最初の例では、C#は自動的にプライベートバッキングフィールドを生成するため、技術的にはデータメンバはgetter/setterのみpublicとして宣言されません。

+0

技術的には、意味のない区別です。 –

+8

実際にはありません。プロパティは他の領域で使用できますが、メソッドやフィールドでは使用できません。自動バインディングが気になります。 –

+7

実際には、状況によっては非常に重要です。パブリック変数を宣言すると、ABIをそのアセンブリに変更しない限り、パブリック変数であることに固執しています。と{get;セット; }パブリックプロパティでは、アクセサメソッドを使用してすべてのパブリックアクセスが行われるため、後で異なる機能を持つアクセサメソッドを変更して、誰もあなたのアセンブリを参照するアプリケーションを再コンパイルしないようにできます。 –

0

非常に妥当で、教授(文脈なし)は間違っています。しかし、とにかく、 "自動プロパティ"を使用して、大丈夫です、あなたはそれが公的または私的であるかどうかを行うことができます。

私の経験では、私が1つ使うときはいつも、そこにロジックを書く必要があり、オート・プロップを使うことはできません。

+1

JavaはC#のようなプロパティを持っていないので、私はコンテキストがJava(あるいはおそらくC++)だろうと推測します。 – FrustratedWithFormsDesigner

+0

ソース全体を完全に制御でき、常に一緒にコンパイルされている場合は、プロパティやパブリック変数を使用する場合(特殊な場合を除く)、実際にはほとんど違いがありません。しかし、異なる人々がコードの異なる部分を書いている状況では、それはより重要になります。プロフェッショナルライブラリは、パブリック変数を外部コードに公開しません。 –

+0

これらの反応を読んで私は夕暮れゾーンにいるような気がします。 –

7

はい、メンバは、通常、いくつかの理由で正常に宣言されるべきではありません。後でクラスを継承するOOPについて考えてみましょう。フィールドをオーバーライドするのは難しいです。 :-)また、内部からの直接アクセスを妨げることもありません。

シンプルなget;セット;デザインはC#2.0で導入されました。基本的にはプライベートメンバーがそれを裏付ける(Reflectorのようなツールで逆コンパイルして参照する)すべてを宣言するのと同じです。

public int someInt{get;set;} 

は単純化されたゲッター/セッターを持っていることについての素晴らしい部分はあなたがより多くの根性、後少しで実装を記入したい場合、あなたが壊れていないということです

private int m_someInt; 
public int someInt{ 
    get { return m_someInt; } 
    set { m_someInt = value; } 
} 

に直接等しいですABIとの互換性。

ゲッタ/セッタが間接的にコードをスローダウンすることは心配しないでください。 JITには、インライン化と呼ばれることがあり、ゲッター/セッターを直接フィールドアクセスと同じくらい効率的に使用します。

+1

私は同意します。 長いライブ.NETライブラリを検討してください。それを維持するには、何かを外界に公開する前に非常に注意する必要があります。また、フィールドの代わりにプロパティを公開する必要があります。 これは、将来のバージョンと同じように安全な方法です。呼び出すアセンブリを傷つけることなく、このプロパティの実装を自由に変更することができます。 フィールドを直接公開するとどうなりますか?それは決して変わらないので、無限の悪夢でなければなりません。 –

1

「純粋な」オブジェクト指向のアプローチでは、オブジェクトの状態を公開することはまったく問題ではないと考えられます。これは、.NETおよびJava/EJBのget_set_proteteisに実装されているプロパティに適用されます。そのアイデアは、オブジェクトの状態を公開することによって、オブジェクトの内部データ表現に対する外部依存関係を作成することです。純粋なオブジェクト設計は、パラメータを持つメッセージへのすべての対話を減らします。戻る現実の世界へ

:あなたは仕事上、このような厳格な理論的なアプローチを実装しようとした場合、あなたはどちらかのオフィスの外に笑っまたはパルプに殴られます。プロパティは、純粋なオブジェクトデザインと完全に公開されたプライベートデータとの間の合理的な妥協であるため、非常に人気があります。

7

はい。データメンバーはプライベートであり、自動的なプロパティが許可されており、正しい方法でパブリックアクセスできます。

しかし、あなたは注意する必要があります。文脈を理解することは非常に重要です。スレッド化されたアプリケーションでは、別の関連プロパティに続く1つのプロパティを更新すると、一貫性に害を及ぼす可能性があります。その場合、適切な方法で2つのプライベートデータメンバを更新するセッタメソッドがより理にかなっています。

0

あなたの教授はかなり正しいです。

は「ゲッター」は避けるべき理由のこの簡単な例を考えてみましょう:1,000あなたのプログラムで getX()メソッドの呼び出し、およびこれらの呼び出しの一つ一つが、戻り値は、特定のタイプであることを前提としてあるかもしれません。 getX()の戻り値は、たとえば、ローカル変数にsotredされ、変数型は戻り値の型と一致しなければなりません。 Xのタイプが変更されるようにオブジェクトが実装される方法を変更する必要がある場合、あなたは深刻な問題に直面しています。 Xintことが、今 longなければならないために使用した場合、あなたは今千コンパイルエラーを取得します。戻り値を intにキャストして問題を正しく修正すると、コードは正常にコンパイルされますが機能しません。 (戻り値は切り捨てられることがあります)。変更を補うために、1000回の呼び出しのすべてを囲むコードを変更する必要があります。私は少なくとも、それほど多くの仕事をしたくありません。

Holub On Patterns

+0

それは本当に質問の文脈では意味をなさない。代わりに何がありますか?誰かにクラスメンバーを取得させてはいけませんか? – Sterno

+0

Sterno:まあ、彼の教授さえそうだと言われるようです(「私の教授は、データメンバーは決して公に宣言してはいけない」と言った)。なぜデータメンバーをパブリックに宣言するのが悪いのですか?同じエフェクトにもっと多くのコードを書くことは大丈夫ですか? –

+0

私は彼の教授が言ったことに同意します。私はちょうどあなたが引用したものが実用的なアプリケーションでは多くの意味を持つとは思わない。 Resharperのようなツールは、ゲッター/セッターを使用していなくても、変数の型をかなり簡単に変更します。メソッドでは、プロパティタイプの変更に関連する苦痛を回避するつもりはありません。だから私は彼の教授が言ったことを裏づけているが、私はこの見積もりが議論を支持するほどのものではないと思う。 – Sterno

1

があるため、パブリックデータメンバーと、そのデータメンバーを変更することができますまたはクラス から読み出すことができ、あなたが/ライト動作アクセシビリティを読んで制御することはできませんが、プロパティを持つあなたは 読み取り/書き込みを制御することができます例えばストリームは、この文を考えてみます。

public MyVar{private get; public set;} 

MyVarの値は唯一のクラスの内部で変更することができますし、クラスの外に読み取ることができることを意味します(個人的に読み、公に読み取り)、これはPではありません公共のデータメンバーだけのossible

+0

新しいユーザーのヒント:非常に古い質問への回答を追加することはあまり役に立ちません。その質問には既に回答がたくさんあります。 – hyde

関連する問題