0

コードにかなりの数のディクショナリバインディングがあります。それらのほとんどは見つからず、FallBackValueを使用します。

これはすべてユーザーにとって素晴らしい機能です。

ただし、デバッガーで実行すると、これらのエラーがすべて出力ウィンドウに表示されるまでに非常に長い時間がかかります。

この質問をしたところ、 WPFディクショナリのバインドの失敗は非常に遅く、DependencyProperty.UnsetValueを返す必要があると言われました。

私はそれを試しました、そしてそれはコンパイルします。しかし、それを実行すると、例外が発生します。

DependencyProperty.UnsetValueも返すことができるディクショナリを定義する方法はありますか? (または、より速く失敗する他の方法。)

更新:これが私が試した反復です:

public class NullTolerantDictionary<TKey, TValue> 
           : Dictionary<TKey, TValue> where TValue : class
{
    public new TValue this[TKey key]
    {
        get
        {
            TValue value;
            bool success = TryGetValue(key, out value);
            if (success)
                return value;

            var errorResult = DependencyProperty.UnsetValue as TValue;

            if (errorResult != null)
                return errorResult;

            return default(TValue);
        }
    }        
}
4

1 に答える 1

1

UnsetValueの実行時型は Object であるため、errorResult は他の TValue 型に対して null になり、null になりdefault(TValue)ます。したがって、最終的には、適切な例外をスローするのではなく、通常、キーが欠落しているときに null を返します。これは IDictionary 契約に反しているため、うまくいきません。本質的に、クラスは実際の IDictionary のように見えます (つまり、IDictionary を実装しています) が、実際には IDictionary ではありません (つまり、IDictionary のように動作しません)。実行時にどのような例外が発生するかはわかりませんが、メソッド呼び出しが null を返すことを期待していないクライアント コードからの NullReferenceException だと思います。

基本的に、既存のコードのdict[key]ように書き直そうとしています。dict.TryGetValue(key)動機には共感できますが、これではうまくいきません。呼び出し側から修正する必要があり、それを制御できないようです。

于 2013-02-20T01:35:04.393 に答える