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 を使用してルックアップを 2 回実行しないようにすることをお勧めします (ContainsKey を実行するときに 1 回、インデクサーを使用するときにもう一度 [])。したがって、より良い解決策は次のとおりです。

public Object GetObject(string foo){

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

コードが正確であると仮定すると、スコープの問題があります。pullObject を if ステートメントのスコープ内で宣言しているため、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
}

このアプローチはルックアップ操作を 1 回だけ実行し、CPU を節約します (ただし、このアプローチを使用して速度を改善すると主張するのは、マイクロ最適化になります)。

于 2012-11-06T18:16:08.810 に答える