1

次のような文字列をオブジェクトにマップする辞書があります。 Dictionary<string, object> myDic;

オブジェクトの型が文字列に基づいていることは前もって知っていますが、私の質問は、TryGetValue を使用するか、try、catch ステートメントを使用して直接検索するかです。

例:

//TryGetValueMethod
object myObject = null;
myDic.TryGetValue("test", out myObject);

MyCustomType t1 = (MyCustomType) myObject;

//Direct lookup method
try
{
     MyCustomType t2 = (MyCustomType) myDic["test"];
     //Do something here...
} catch {}

どのような方法が好ましいと思いますか? 2 つ目は、余分なキャストがないため、よりクリーンなコーディングですが、例外がないため、最初のものよりも効率が悪いと思います。

4

3 に答える 3

5

MSDN は、「このメソッド [TryGetValue] を使用する方が、Item プロパティによってスローされた KeyNotFoundException をキャッチするよりも効率的です」と述べています。

また、「メソッドの機能と Item プロパティTryGetValue を組み合わせる」ContainsKeyことも説明しています..

また、すべての例外ではなく、その特定の例外のみをキャッチする必要があります。

更新: C# 7 以降、次のように記述できるようになりました。

if (myDic.TryGetValue("test", out MyCustomType value)) {
   // do something with value
}
于 2013-06-03T22:15:45.187 に答える
4

try/catchを使用してそのような論理パスを形成するべきではないと思います。Exceptions は、何かが「うまくいかなかった」という例外的なケースであると想定されています。

個人的には、私は好きContainsKeyです:

if (myDic.ContainsKey("test")) {
   MyCustomType value = myDic["test"];
   // do something with the value
}

キーが見つからないことが「問題が発生した」ことを意味すると考える場合は、テストを省略し、キーが見つからない場合は例外をスローします。

編集:最近はTryGetValue代わりに使用しようとしています。少し不器用ですが、慣れればそれほど悪くはありません。

MyCustomType value;
if (myDic.TryGetValue("test", out value)) {
   // do something with value
}

EDIT2:今でout varは間違いなくTryGetValueもっとたくさん使っています。ほとんどの場合、値があるときではなく、値がないCantGetValueときに何か特別なことをしたいので、同様にメソッドを書くことができます(反対のブール結果でも同じことです)。

if (dict.TryGetValue("test", out var value)) {
   // do something with value
}

// or

if (cache.CantGetValue("test", out var cachedValue)) {
   // cache value
}
// make use of value
于 2013-06-03T22:13:14.913 に答える
0

キーが常に存在する必要があると安全に予測できる場合は、Try ... Catch でラップします。このようにして、何か問題が発生した場合にのみ例外がスローされます。

これTryGetValueはより良いオプションです -Dictionary.ContainsKey(key)それは同じくらい良いです - 最終的にはTryGetValue舞台裏と同じことをします.

于 2013-06-03T22:16:03.690 に答える