2017-05-01 6 views
1

これは意味がありますか、または等価チェックは冗長ですか?XF BindableProperyで同等かどうかをチェックするのは意味がありますか?

public int SelectedIndex 
{ 
    get { return (int)GetValue(SelectedIndexProperty); } 
    set 
    { 
    if (value != SelectedIndex) 
     SetValue(SelectedIndexProperty, value); 
    } 
} 

私はsource codeにビットを見て、それが実際の等価性のチェックに到達するまでオブジェクトは長い道のりを行っているように見える、とさえ、私はそれかどうかを把握するために十分深く掘るませんでしたそれでもなお、GetValueのオーバヘッドははるかに簡単ですが、ここでの参照平等チェックは推奨/冗長ですか?
私はすべてのプロパティでそれをやるつもりはありませんが、オーバーヘッドの多い繰り返しのものがあります。

+0

あなたは 'SetValue'部分にいくつかのホップを保存しますが、' GetValue'でもいくつかの部分を失うので、最終的には違いがないようです。両方のアプローチをベンチマークして、正確なパフォーマンスの違いを調べることができます。 –

+0

私は、 'SetValue'を使うことが等しい値を再割り当てする前にチェックすることが保証されているかどうかは分かりませんでした。 – Shimmy

答えて

2

チェックBindableObjectクラスのこの部分:https://github.com/xamarin/Xamarin.Forms/blob/master/Xamarin.Forms.Core/BindableObject.cs#L554

価値がOnPropertyChangingイベント(ライン554)をトリガする前に、同じかどうかをチェックして、コンテキスト値を設定する前に(ライン563):

if (!same || raiseOnEqual) 
{ 
    context.Value = value; 
} 

パフォーマンスによれば、プロパティの値を変えてベンチマークしました。あなたが示唆するように値をチェックすると、平均して約56ティックがかかりますが、そうでない場合は平均で約54ティックです(基本的なベンチマーク、あまり科学的ではありません)。

結論としては、BindablePropertiesでこれらのように等価性をチェックすることはあまりありません。

+0

実際に同じになっているのはいつですか?私の質問は実際のところパフォーマンス上ではありませんでした。 'BindableProperty.Create'の' propertyChanged'デリゲート引数が、 'oldValue'と' newValue'を等しくして呼び出されることになりました。 – Shimmy

+1

1つのアプローチを使用する方法や他の方法を使用することがパフォーマンスの選択であることが多いため、その答えにパフォーマンスの一部を含めることができます。 'propertyChanged'デリゲートは、プロパティが実際に異なる場合にのみ呼び出されます(参照されるクラスの595行を参照)。 PS: 'raiseOnEqual'フラグは内部フラグです。 –

関連する問題