有没有一种方法可以影响所有通用类,从而在C#中的以下异常中获取给定键的值?我认为这是Microsoft的异常描述中的一个大小姐。
"The given key was not present in the dictionary."
更好的方法是:
"The given key '" + key.ToString() + "' was not present in the dictionary."
解决方案可能涉及mixin或派生类。
有没有一种方法可以影响所有通用类,从而在C#中的以下异常中获取给定键的值?我认为这是Microsoft的异常描述中的一个大小姐。
"The given key was not present in the dictionary."
更好的方法是:
"The given key '" + key.ToString() + "' was not present in the dictionary."
解决方案可能涉及mixin或派生类。
.ToString()
有意义的键。对于a的情况,我同意Dictionary<string, *>
这是对异常描述的不错补充,但不能将其应用于所有类型的Dictionary<*,*>
对象。
Answers:
当您尝试索引不存在的内容时,将引发此异常,例如:
Dictionary<String, String> test = new Dictionary<String,String>();
test.Add("Key1,"Value1");
string error = test["Key2"];
通常,像对象之类的东西通常是关键,这无疑使它变得更难获取。但是,您始终可以编写以下内容(甚至将其包装在扩展方法中):
if (test.ContainsKey(myKey))
return test[myKey];
else
throw new Exception(String.Format("Key {0} was not found", myKey));
或更有效(感谢@ScottChamberlain)
T retValue;
if (test.TryGetValue(myKey, out retValue))
return retValue;
else
throw new Exception(String.Format("Key {0} was not found", myKey));
Microsoft选择不执行此操作,可能是因为在大多数对象上使用时将无用。它很简单,可以自己做,所以只需自己动手!
ContainsKey
那么索引将导致字典两个查找。进行aTryGetValue
只是一次查找,您可以仅使用其布尔输出来选择if / else块。
在一般情况下,答案是“否”。
但是,您可以将调试器设置为在首次引发异常的位置中断。届时,不存在的密钥将作为调用堆栈中的值进行访问。
在Visual Studio中,此选项位于:
调试→异常...→通用语言运行时异常→System.Collections.Generic
在这里,您可以选中“投掷”框。
对于在运行时需要信息的更特定的实例,只要您的代码使用IDictionary<TKey, TValue>
并且不直接绑定到Dictionary<TKey, TValue>
,则可以实现自己的提供此类行为的字典类。
如果要管理键丢失,则应使用TryGetValue
https://msdn.microsoft.com/zh-CN/library/bb347013(v=vs.110).aspx
string value = "";
if (openWith.TryGetValue("tif", out value))
{
Console.WriteLine("For key = \"tif\", value = {0}.", value);
}
else
{
Console.WriteLine("Key = \"tif\" is not found.");
}
您可以尝试此代码
Dictionary<string,string> AllFields = new Dictionary<string,string>();
string value = (AllFields.TryGetValue(key, out index) ? AllFields[key] : null);
如果键不存在,则仅返回一个空值。