2008-10-03 13 views
3

について学ぶ:それは(私は明らかに私のクラス全体の変数BarNameを使用し、現在のプロパティ値が設定されている場合、ロジックを追加する必要が私は、自動実装properiesを使用して単純なクラス持っ自動実装プロパティ

Public Class foo 
{ 
    public foo() { } 

    public string BarName {get; set;} 
} 

をすべて大文字でなければなりません)。これは、BarNameのプライベート変数を作成する必要があることを意味しますか? _BarNameに変更し、クラス全体で使用されている現在のBarName変数を_BarNameに変更しますか?

Public Class foo 
{ 
    public foo() {} 

    private string _BarName = ""; 
    public string BarName 
    { 
     get {return _BarName;} 
     set {_BarName = Value.ToString().ToUpper();} 
    } 
} 

私は、自動実装プロパティを使用しての意味を理解し、私は何かを変更する必要があるときに/もし何それが道をすることを必要とすることを確認しようとしています。私は上記のように、リファクタリングがbreakingの変更ではないと仮定しています。プロパティは基本的に同じままです。クラスの中でちょっとした作業をして、それをそのまま維持し、必要なロジックを追加するだけでした。

もっと意味があるかもしれないもう1つの例は、setterまたはgetterを使用するときに何らかのメソッドを呼び出す必要があるということです。それ以上の値を変更する。

これは、プロパティを設定するための行とコード行との間に公正な関係があるようです。

答えて

7

これは私が今 はい

をBarName

のためのプライベート変数を作成し、私のクラス全体

を使用し、現在のBarName 変数を変更する必要があることを意味しています

クラスの残りのコードを新しいprivate変数を使用するように変更しないでください私はあなたが作成できます。 BarNameはプロパティとして、プライベート変数(他のものの中でも)を非表示にすることを目的としています。

私は、プロパティは、基本的に同じ が滞在しているので、リファクタリングは、上記のよう よう、互換性に影響する変更 ではないと仮定しています。それはちょうど そのように保つために少しの作業を取って、 は、必要なロジックを追加します。

正しいです。

+0

ああ、私は自分で変数にアクセスするためにプロパティを使用しますか?それが読んでいるだけの場合、本当にそれを行うことはできません。私が意味するコードは、変更が必要な/ inside/classです。 – Brettski

+0

あなたの例では、それは読み取り専用ではありません。しかし、あなたがそれを持ち出すようになったので、私の応答は、あなたがプロパティを公に読めるようにし、私的に設定できることです{get;プライベートセット; }パターンを作成し、クラス内から書き込むことができます。 – hurst

6

何も変更する必要はありません。自動実装されたプロパティは単なる構文的な砂糖です。コンパイラはプライベート変数を生成し、あなたのためにロジックを取得/設定します。独自のgetter/setterロジックを追加すると、コンパイラは自動生成コードの代わりにコードを使用しますが、そのプロパティのユーザまでは何も変更されていません。あなたのプロパティを参照するコードは引き続き動作します。

+0

OK。しかし、セッターとゲッターにロジックを導入するために、私の例で行ったようにコードを変更する必要があります。 – Brettski

+0

はい、うまくいくでしょう。文字列のToString()の呼び出しは少し冗長ですが、何も傷つけることはありません。 –

+0

getterまたはsetterが呼び出されたときに何らかのメソッドを呼び出す必要がある場合はどうすればよいですか? – Brettski

0

リファクタリングについては正しいですが、本当に何かを壊すべきではありません。

実際にクラス内の参照をプロパティ名に移動してプライベートフィールドを参照するように変更する必要があるかどうかは、内部コードがどのようにデータの基になる表現にアクセスする必要があるかそれはクラスの消費者に提示された。ほとんどの場合、あなただけで十分に残すことができます。

単純な例では、十分に単調なままにして、クラスの内部のコードがセッターで実行されている変換/書式設定を覆い隠さないようにすることが賢明でしょう。

ゲッターがフィールドの内部表現を消費者がデータを見るために必要なやり方に変えるためにいくつかの魔法を使っていたら、おそらく(場合によっては)クラス内の内部コードがフィールド。

クラス内のauto-propertyへのアクセスのそれぞれの発生を見て、フィールドに触れるか、プロパティを使用するかを決定する必要があります。

5

自動プロパティを使用すると、基礎となる「バッキング」変数に直接アクセスすることはなく、ゲッターとセッターのプロパティで実装される実際のロジックにアクセスすることはできません。プロパティにアクセスすることができます(したがって、コード全体でBarNameを使用します)。

設定者に特定のロジックを実装する必要がある場合は、自動プロパティを使用できなくなり、プロパティを「旧式」の方法で実装する必要があります。この場合は、独自のプライベートバッキング変数を実装する必要があります(プライベートバッキング変数にはプロパティと同じ名前を付けますが、最初の小文字はこの例ではバッキング

この例では、リファクタリングのタイプ(自動プロパティから「プロパティ」への移動は、barNameという名前になります)

0

自動プロパティは構文上の砂糖だけであり、コンパイラは実際にはそれのためのプライベートメンバーを作成します(つまり、publicプロパティの名前またはアクセシビリティは変更されません)。しかし、それは共同で生成されているのであなたはそれにアクセスすることはできません。

以降では、プロパティのgetterとsetterを実装する場合は、そのために明示的なprivateメンバーを作成し、ロジックを追加します。

1

自動プロパティは、そのオブジェクトを検証することがわかっている場合は使用しないでください。これらのオブジェクトは、ドメインオブジェクトなどとすることができます。顧客クラスを持っている場合と同様に、名前、誕生日などを検証する必要があるため、プライベート変数を使用します。しかし、Rssクラスを使用している場合は、実行されている検証は存在せず、クラスはちょうどいくつかのデータを保持するために使用されているからです。

関連する問題