C# 从对象字典中获取对象
我试图从对象字典中提取一个对象,并返回所述对象,但是我在类型方面有点问题。所讨论的类看起来是这样的,我想知道如何返回实际对象而不是变量(我假设它默认为字符串) 我认为拳击是必要的,比如C# 从对象字典中获取对象,c#,object,dictionary,boxing,C#,Object,Dictionary,Boxing,我试图从对象字典中提取一个对象,并返回所述对象,但是我在类型方面有点问题。所讨论的类看起来是这样的,我想知道如何返回实际对象而不是变量(我假设它默认为字符串) 我认为拳击是必要的,比如 object pulledObject = someDict[foo]; 但这似乎不起作用,任何能为我指明正确方向的建议。你并没有说什么不起作用,但你走的是正确的道路。试着这样做: public Object GetObject(string foo){ if (someDict.ContainsKey
object pulledObject = someDict[foo];
但这似乎不起作用,任何能为我指明正确方向的建议。你并没有说什么不起作用,但你走的是正确的道路。试着这样做:
public Object GetObject(string foo){
if (someDict.ContainsKey(foo))
return someDict[foo];
return null;
}
object res;
if (someDict.TryGetValue(foo, out res)) {
} else {
// Object is not there - do something else
}
我怀疑您的问题是,您在子范围内的pulledObject
中遇到编译错误
更新:正如Jon Skeet指出的,使用TryGetValue甚至更好,这样您就不会执行两次查找(一次是在执行ContainsKey时,另一次是在使用indexer[]时)。因此,更好的解决方案是:
public Object GetObject(string foo){
object pulledObject = null;
someDict.TryGetValue(foo, out pulledObject);
return pulledObject;
}
假设代码是准确的,则会出现范围问题。您正在if语句的作用域内声明pullerObject,使其在return语句的作用域外无法访问
public Object GetObject(string foo)
{
object pulledObject = null;
if(someDict.ContainsKey(foo))
{
pulledObject = someDict[foo];
}
return pulledObject;
}
或(由Jon Skeet提供)
代码不起作用的原因不是因为
pulledObject
的类型错误,而是因为它超出了范围。您可以这样做:
public Object GetObject(string foo){
if(someDict.ContainsKey(foo)) {
return someDict[foo];
}
return null;
}
用户将按如下方式调用您的GetObject
:
object res = GetObject(foo);
if (res == null) {
// Object is not there - do something else
}
这种模式的缺点是无法区分对象存在但null
的情况和对象不存在的情况。对于.NET的dictionary API来说,一种更“原生”的方法是使用TryGetValue
而不是GetObject
,如下所示:
public Object GetObject(string foo){
if (someDict.ContainsKey(foo))
return someDict[foo];
return null;
}
object res;
if (someDict.TryGetValue(foo, out res)) {
} else {
// Object is not there - do something else
}
这种方法只执行一次查找操作,节省了CPU(尽管坚持使用这种方法来提高所谓的速度是一种微观优化)。如果密钥不存在,它应该返回什么?您有一个范围问题。您将PullerObject声明在if语句的作用域内,使其无法在外部访问,以便return语句工作。您是否遇到编译错误或程序在运行时出现故障?“不起作用”有点模糊。第二个语句中的
if
语句是多余的。如果TryGetValue
返回false,PullerObject将已经为null。@雅各布·亚伯拉罕我刚刚读到了这一点,意识到我的冗余错误。=)@JonSkeet,使用ContainsKey
和TryGetValue
有什么区别?这个问题纯粹是学术性的。@BigM:TryGetValue只需要查找一次:为什么要执行一次查找以检查是否存在(找到条目但忽略该值),然后再次查找条目以获得值?@JonSkeet,明白了。我道歉。谢谢你抽出时间!