Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 从对象字典中获取对象_C#_Object_Dictionary_Boxing - Fatal编程技术网

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,明白了。我道歉。谢谢你抽出时间!