0

每当我看到这样的代码时,我都会头疼。谁能解释这是在做什么?

public static class MyExtensionFirADictionary
{
    public static TValue <TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key)
    { 
        TValue value;
        if (dic != null && dic.TryGetValue(key, out value))
            return value;

        return default(TValue);
    }
}
4

3 回答 3

2

忽略编译错误,只是说“返回对键持有的值,如果有的话 - 否则返回字典的默认值”,通过扩展方法。该名称未显示,但可以通过以下方式使用:

string name = nameLookup.GetValueOrDefault(userId);

请注意,编译器隐式处理泛型 - 调用者不需要指定它们。

首先,代码检查字典是否为空;如果它为空,它只返回默认值。

TryGetValue 是一个标准的字典方法,它进行查找并在有效时返回 true;代码使用该方法,如果有则返回获取的值 - 否则它显式使用 TValue 的默认值。

于 2013-06-08T20:15:52.463 回答
2

外行术语

//首先将方法名称添加到您的示例扩展方法中,以便编译

public static class MyExtensionFirADictionary
{
   public static TValue GetGenericValue <TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key)
   { 
       TValue value;
       if (dic != null && dic.TryGetValue(key, out value))
           return value;

       return default(TValue);
   }
}

现在让我们从头开始:

方法签名:

       public static TValue GetGenericValue <TKey, TValue>(this IDictionary<TKey, TValue> dic, TKey key)

返回 TValue 类型的对象,即

Dictionary<string, int> dict = new Dictionary<string, int>();

在这种情况下,如果你打电话

dict.GetGenericValue("thekey");

TValue 将是 int 类型(注意<string, int>并将其与您的原始方法相关联

需要理解的重要信息:

将泛型视为模板。TValue, TKey 只是您在执行此操作时指定的占位符:

List<myclass>

高温高压

于 2013-06-08T20:24:35.397 回答
0

它允许与默认字典行为相同的功能,但更易于使用。

var dictionary = new Dictionary<string, object>();

//add items to dictionary

所以默认是这样的:

    if(dictionary.ContainsKey("someKey"))
    {
        var value = dictionary["someKey"];
    }

但是,如果它没有该密钥,并且您没有进行 ContainsKey 检查,则会引发异常。扩展方法做什么,它执行一个 TryGetValue,它检查键是否存在,如果存在则返回值,否则返回 default(T)

新用途是(假设扩展方法的名称是 GetValue):

var value = dictionary.GetValue("someKey");

更短更干净。

于 2013-06-08T20:18:11.077 回答