4

自動実装されたプロパティを使用する単純なクラスがあります。

Public Class foo
{
    public foo() { }  

    public string BarName {get; set;}
}

クラス全体で変数 BarName を使用していることは明らかで、プロパティ値を設定するときにロジックを追加する必要があります (すべて大文字にする必要があります)。これは、_BarName などの BarName のプライベート変数を作成し、クラス全体で使用されている現在の BarName 変数を _BarName に変更する必要があるということですか?

Public Class foo
{
    public foo() {}  

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

自動実装されたプロパティを使用することの意味と、何かを変更する必要がある場合に何が必要になるかを理解しようとしています。上記のように、プロパティは基本的に同じままであるため、リファクタリングは重大な変更ではないと想定しています。クラスをそのまま維持し、必要なロジックを追加するには、クラス内で少し作業が必要でした。

より意味のある別の例として、setter または getter を使用するときにメソッドを呼び出す必要があるというものがあります。値を変更するだけではありません。

これは、プロパティをセットアップするためのコードの行数と行数の公正なトレードオフのようです。

4

6 に答える 6

7

これは、BarName のプライベート変数を作成する必要があるということですか?

はい

クラス全体で使用されている現在の BarName 変数を変更します

作成した新しいプライベート変数を使用するように、クラスの残りのコードを変更しないでください。プロパティとしてのBarNameは、コードの残りの部分を大幅に変更することを避けるために、(特に) プライベート変数を非表示にすることを目的としています。

上記のように、プロパティは基本的に同じままであるため、リファクタリングは重大な変更ではないと想定しています。それを維持し、必要なロジックを追加するのに少し手間がかかりました。

正しい。

于 2008-10-03T03:41:23.180 に答える
6

何も変更する必要はありません。自動実装されたプロパティは単なるシンタックス シュガーです。コンパイラは、舞台裏でプライベート変数と get/set ロジックを生成しています。独自の getter/setter ロジックを追加すると、コンパイラは自動生成コードの代わりに独自のコードを使用しますが、そのプロパティのユーザーに関する限り、何も変更されていません。プロパティを参照するコードは引き続き機能します。

于 2008-10-03T03:27:46.757 に答える
5

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

セッターに特定のロジックを実装する必要がある場合は、自動プロパティを使用できなくなり、「昔ながらの」方法でプロパティを実装する必要があります。この場合、独自のプライベート バッキング変数を実装する必要があります (少なくとも私にとって好ましい方法は、プライベート バッキング変数にプロパティと同じ名前を付けることですが、最初は小文字です (この場合、バッキングvariable は barName という名前になります。次に、getter/setter に適切なロジックを実装します。

あなたの例では、それが重大な変更ではないことは正しいです。このタイプのリファクタリング (自動プロパティから「通常の」プロパティへの移行は、パブリック インターフェイス (パブリック プロパティの名前またはアクセシビリティ) を変更していないため、重大な変更にはなりません。

于 2008-10-03T03:33:03.340 に答える
1

オブジェクトを検証することがわかっている場合は、自動プロパティを使用しないでください。これらのオブジェクトは、ドメイン オブジェクトなどにすることができます。Customer クラスがある場合と同様に、名前、生年月日などを検証する必要があるため、プライベート変数を使用します。しかし、Rss クラスを使用している場合は、自動プロパティを使用するだけで問題ありません。実行される検証はなく、クラスはデータを保持するためにのみ使用されるためです。

于 2008-10-03T04:42:08.730 に答える
0

あなたはリファクタリングについて正しいですし、実際には何も壊すべきではありません。

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

あなたの単純な例では、十分にそのままにして、クラス内部のコードがセッターで実行されている変換/フォーマットを覆すことがないようにすることが賢明です。

一方、ゲッターがフィールドの内部表現を消費者がデータを表示するのに必要な方法に変更する魔法を行っている場合、おそらく (場合によっては) クラス内の内部コードがフィールドにアクセスする必要があります。

クラス内の自動プロパティへのアクセスが発生するたびに確認し、フィールドにアクセスするか、プロパティを使用するかを決定する必要があります。

于 2008-10-03T03:32:38.740 に答える
0

自動プロパティはシンタックス シュガーにすぎません。実際、コンパイラはそのプライベート メンバーを作成しますが、コンパイル時に生成されるため、アクセスできません。

後で、プロパティのゲッターとセッターを実装する場合は、明示的なプライベート メンバーを作成してロジックを追加します。

于 2008-10-03T03:34:55.583 に答える