4

我正在尝试从对象字典中提取一个对象,并返回所述对象,但是我在类型方面遇到了一些问题。有问题的类看起来像这样,我想知道如何返回实际对象而不是变量(我假设默认情况下是一个字符串)。

 public Object GetObject(string foo){

 if(someDict.ContainsKey(foo))
 {
   var pulledObject = someDict[foo];

 }
  return pulledObject;
 }

我原以为需要拳击,比如

 object pulledObject = someDict[foo];

但这似乎不起作用,任何可以为我指明正确方向的建议。

4

3 回答 3

9

你并没有真正说什么是行不通的,但你在正确的轨道上。尝试这样的事情:

public Object GetObject(string foo){

  if (someDict.ContainsKey(foo))
    return someDict[foo];
  return null;
}

我怀疑您的问题是您遇到了一个pulledObject在子范围内的编译错误。

更新:正如 Jon Skeet 指出的那样,使用 TryGetValue 会更好,这样您就不会执行两次查找(一次是在执行 ContainsKey 时,另一次是在使用索引器 [] 时)。因此,更好的解决方案是:

public Object GetObject(string foo){

  object pulledObject = null;
  someDict.TryGetValue(foo, out pulledObject);
  return pulledObject;
}
于 2012-11-06T18:15:21.330 回答
2

假设代码是准确的,您就有范围问题。您在 if 语句的范围内声明您的 pullObject,使其无法在外部访问以使您的 return 语句正常工作。

public Object GetObject(string foo)
{
    object pulledObject = null;
    if(someDict.ContainsKey(foo))
    {
        pulledObject = someDict[foo];
    }
    return pulledObject;
}

或(由 Jon Skeet 提供)

public Object GetObject(string foo)
{
    object pulledObject = null;
    someDict.TryGetValue(foo, out pulledObject);
    return pulledObject;
}
于 2012-11-06T18:15:28.460 回答
1

您的代码不起作用的原因不是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 的字典 API 更“原生”的方法是使用TryGetValue而不是GetObject,如下所示:

object res;
if (someDict.TryGetValue(foo, out res)) {
} else {
    // Object is not there - do something else
}

这种方法只执行一次查找操作,节省了 CPU(尽管坚持使用这种方法来提高所谓的速度将是一种微优化)。

于 2012-11-06T18:16:08.810 回答