c#,哪种编码技术更快?

Nei*_*eil 0 c# silverlight-3.0

public static Dictionary<string,List<LookupItem>> dict;

if (dict == null)
{
   dict = IsolatedStorage.GetDropDowns();
   return dict["Priority"]
}
else
   return dict["Priority"];
Run Code Online (Sandbox Code Playgroud)

要么

try
{
   return dict["Priority"];
}
catch(KeyNotFoundException e)
{
   dict = IsolatedStorage.GetDropDowns();
   return dict["Priority"];
}
Run Code Online (Sandbox Code Playgroud)

这是一个silverlight应用程序,我有下拉缓存在隔离存储中(如果我必须查询wcf服务的每个查找然后datagrid永远出现,我很清楚,下拉可能会过时,我有一个更新字典的方法当通过回调添加/删除新值时,在我的xaml中,我有一个转换器,它将从dbquery返回的Id转换为相关的LookupItem对象.我知道我永远不应该使用try和catch作为应用程序逻辑的一部分,但我真的需要尽可能快的方法,因此我愿意忽略那个架构禁忌.字典变为空的原因是因为我将字典存储为仲裁类中的静态var,如果用户必须按F5刷新页面,字典将丢失其值,因为重新加载了xap文件和我的缓存页面在登录时执行的将不会执行."优先级"包含一个List.LookupItem包含ComboBoxes所需的键/值等.

1)字典是存储这些信息的最有效方式吗?2)两种方法中的哪一种会产生最快的清单回报?

Jon*_*eet 8

那么你开始时缺乏支撑,但我会把它写成:

if (dict == null)
{
   dict = IsolatedStorage.GetDropDowns();
}
return dict["Priority"];
Run Code Online (Sandbox Code Playgroud)

请注意,您可能需要一些锁定才能使此线程安全.事实上,为什么不把它写成:

public static Dictionary<string,List<LookupItem>> dict 
    = IsolatedStorage.GetDropDowns();
Run Code Online (Sandbox Code Playgroud)

开始?然后你知道它永远不会是空的.

无论如何,请不要使用第二个想法.检查无效是非常快的,无论如何你仍然会失败NullReferenceException而不是KeyNotFoundException......

如果你真的想要根据是否存在密钥而表现不同,你应该使用(假设dict已经非空):

List<LookupItem> list;
if (!dict.TryGetValue("Priority", out list))
{
    // Deal with the key being missing
}
else
{
    return list;
}
Run Code Online (Sandbox Code Playgroud)

我还要质疑你是否需要将其作为"最快的方法"的判断 - 一旦你确定只从WCF执行一次获取,你确定它确实是一个性能瓶颈吗?如果是这样的话,我会感到震惊.