2017-06-20 8 views
2

単純なプロパティを実装する場合、あなたはコードを作るために、auto-implemented propertiesを利用することができ、このように、単純に見える:非変更値と自動実装プロパティ

public int MyInt 
{ 
    get; set; 
} 

それとも、「手動でそれを実装することができます"プライベートフィールド。この場合、setを使用する前に、人々が価値の変化をチェックしていることがよくあります。このように:

private int _myInt; 

public int MyInt 
{ 
    get { return _myInt; } 
    set 
    { 
     if value != _myInt 
      _myInt = value; 
    } 
} 

私の質問はこれです:変更された値(後者の場合)が何かに適しているかどうかチェックしていますか?そして、そうであれば、これは自動実装されたプロパティにどのような影響を与えますか?

+0

を実装するときには、簡単な検証を行うことができ、チェックを使用します。 – NtFreX

+1

私の意見では、プロパティのセッターメソッドやゲッターメソッドにはロジックがあってはいけません。また、自動プロパティを使用することを提案します。 – Praveen

+0

ちょっとしたことですが、プライベートプロパティではなく、プライベートフィールドと呼ばれています。パブリックプロパティはプライベートフィールドを使用します。 –

答えて

3

あなたはINotifyPropertyChanged
(あなたがセッターが呼び出されたときに、プロパティの値が実際にいないだけで、変更する場合にのみ、イベントを発生します。)

+0

+1最後の文を削除することができます。それは他の答えから見ることができるように、他のいくつかの場合に役立ちます。 –

+0

私はこの回答者を受け入れたとマークしていますが、すべての回答を読むことを強くお勧めします。このポストには多くの素晴らしい点があります。参加した皆さん、ありがとう。 – Noceo

1

両方を行うことはできません。自動実装されたプロパティを使用し、その値を確認してください。ゲッターまたはセッターのいずれかにロジックを導入するとすぐに、それは自動的に実装されたプロパティではなくなります。

auti-実装する宿泊施設には、プライベートバッキングフィールドにアクセスするゲッター/セッターのためだけ糖衣構文がyou'dされているかのように書き込み、この:あなたがもし新しい価値さえを確認したい

public int MyInt 
{ 
    get { return _myInt; } 
    set { _myInt = value; } 
} 

あなたがいくつかのロジックを持つセッターを使用することが有効です。たとえば、アプリケーションが負の値を処理できないため、整数が正であるかどうかを確認することができます。だからあなたは単にセッターでその小切手を紹介します。

set 
{ 
    if (value >= 0) 
     _myInt = value; 
} 

さておき、あなたが(それはゲッターまたはセッターのいずれかである)一つだけの部分を定義can'tとして、あなたは括弧の両方を定義する必要があります。反対側では、もちろん、それらのうちの1つを完全に省略して、プロパティを読み取り専用または書き込み専用にすることができます(後者の使用についてはほとんど考えられませんが)。実際にはプロパティもgetメソッドとsetメソッドの構文的砂糖です。だからあなたはそれらをいつもの方法と考えることができます。なぜそこに論理を導入してはいけないのですか?もちろん、プロパティは、セッターやゲッタ内で何も特別なことが起こっていないと思うようになりがちですが、これはまた、慣習が示唆しているものです。しかし実際には何も特別なことはありませんが、プロパティの自動実装では、IDEには知られていないので、あなたのコードでアクセスできないバッキングフィールドにアクセスするだけですが、存在しますIL as shown here内にあります。

編集:あなたの質問に戻ってください。

int newValue = -1; 
if(newValue >= 0) 
    myInstance.MyInt = newValue; 

しかし、これは非常に厄介とで次のようになります。それはyou'dセッター内またはその前に、新しい価値を検証するためのロジックを導入した場合、このようにあなたもこれを書くことができます実質的な違いを作るwon't具体的には、あなたのコードのどこか他の場所にプロパティを設定してもう一度チェックする必要があるとすぐに、手元にあるDRYを破棄します。だから、それを行う方が良いです(セッター内で)once, and only once

+1

おそらく質問をより慎重に読むべきです。あなたの答えは質問とは関係がないようです。 –

+0

@RacilHilan質問は、自動実装されたプロパティが検証との結合で使用できるという間違いの前提に基づいています。私はそれをクリアし、それらが実際には単なる方法であることを示しました。 – HimBromBeere

+0

うーん、私はもう一度質問を読んだが、間違った仮定を見逃した。たぶん私はあなたが見るものを見ません。 –

1

変更された値(ラダーケースの場合)を確認していますか?

少なくとも、提供した例ではありません。まあ、巨大なループ(数十万)のプロパティに割り当てるコードを持っていない限り、値をチェックするのが割り当てよりも数ミリ秒早い場合、目立った違いが見えます。 intの場合は確信が持てないので「if」と言ったので、答えに興味があればテストしなければなりません。

しかし、他のシナリオでは、顕著な違いがあります。たとえば、設定者が単なる値の割り当て以上のものである場合などです。

1

MyIntはマウスの位置であると仮定すると、マウスの位置を1ミリ秒ごとに取る無限ループがあり、ウィンドウに表示されます。マウスが静止している場合は、毎ミリ秒ごとにウィンドウを更新する必要がないことを確認してください。

ほとんどの場合、チェックする必要はありませんが、同じvalueであっても値が変更されます。パフォーマンスの問題が発生したときに実行します。

+1

これは良い例ですが、割り当てが検査よりも遅いと仮定しています。私はそのような場合は、少なくとも単純なタイプのためではないか分からない。しかし、プロパティが複雑なタイプのもので、検査がその一部を読み取っているだけなら、これは優れた例になります。 –

+0

すばらしい例。この例で必要とされる検証は、「手動」アプローチを使用すべきであることを意味することを指摘してください(他の人がこれを読んでいるため)。 – Noceo

関連する問題