每当我看到这样的代码时,我的头疼。谁能解释一下这是做什么的?
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);
}
}
答案 0 :(得分:2)
忽略编译错误,只是说&#34;返回对密钥持有的值,如果有的话 - 否则返回字典的默认值&#34;,通过扩展方法。该名称未显示,但可以通过以下方式使用:
string name = nameLookup.GetValueOrDefault(userId);
请注意,编译器会隐式处理泛型 - 调用者不需要指定它们。
首先,代码检查字典是否为空;如果它为null,则只返回默认值。
TryGetValue是一个标准的字典方法,它执行查找并返回true,如果它工作;代码使用该方法,并返回获取的值(如果有的话) - 否则它显式使用TValue的默认值。
答案 1 :(得分:2)
Laymans条款
//首先在示例扩展方法中添加方法名称,以便编译
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>
HTH
答案 2 :(得分:0)
它允许与默认字典行为相同的功能,但使其更易于使用。
var dictionary = new Dictionary<string, object>();
//add items to dictionary
所以默认是这样的:
if(dictionary.ContainsKey("someKey"))
{
var value = dictionary["someKey"];
}
但是,如果它没有该密钥,并且您没有执行ContainsKey检查,则会抛出异常。扩展方法的作用是,它执行TryGetValue,它检查密钥是否存在,如果是,则返回值else,返回default(T)
新的用法是(假设扩展方法的名称是GetValue):
var value = dictionary.GetValue("someKey");
更短更清洁。