我最近刚刚注意到了Dictionary.TryGetValue(TKey key, out TValue value),并好奇哪种方法是从字典中检索值的更好方法.

我一直在做:

if (myDict.Contains(someKey))
     someVal = myDict[someKey];
     ...

除非我知道有has人在里面.

这样做是否更好:

if (myDict.TryGetValue(somekey, out someVal)
    ...

哪种做法更好?一个比另一个快吗?我可以想象Try版本会更慢,因为它"吞下"了自己内部的Try/catch,并将其作为逻辑,不是吗?

推荐答案

TryGetValue稍快一些,因为FindEntry只会被调用一次.

要快多少?这取决于天气

仅供参考:它实际上并没有捕捉到错误.

它在呼唤:

public bool TryGetValue(TKey key, out TValue value)
{
    int index = this.FindEntry(key);
    if (index >= 0)
    {
        value = this.entries[index].value;
        return true;
    }
    value = default(TValue);
    return false;
}

康纳斯基是这样的:

public bool ContainsKey(TKey key)
{
    return (this.FindEntry(key) >= 0);
}

.net相关问答推荐

节省用户在整个应用程序中使用的Flutter

在`MAUI`应用中使用Android`MediaPlayer`的`prepare`方法只在发布模式下和在物理设备上崩溃

使用 .NET 在 Windows 中创建弹出式 toastr 通知

通用枚举到int的C#非装箱转换?

为什么要判断这个!= null?

静态代码块

如何将自定义 UserControl 显示为对话框?

为什么字典比列表快得多?

使用只读属性或方法?

运算符重载 ==, !=, Equals

获取 .NET 程序集的 AssemblyInformationalVersion 值?

在生产环境中部署调试符号(pdb 文件)有什么风险?

.Net 正则表达式:单词字符 \w 是什么?

Visual Studio 类图不显示关系

用 double 替换 int 时的 Visual Studio 长编译

将月份 int 转换为月份名称

确定使用 ContextMenuStrip 的控件

DLL 中有什么以及它是如何工作的?

当它被抛出和捕获时,不要在那个异常处停止调试器

如何在我的机器上找到 fuslogvw.exe?