2016-11-30 8 views
0

私はすでにC#拡張関数内で値(== null)を初期化するにはどうすればよいですか?

if (obj == null) 
      obj = new Dictionary<string, object>(); 
to_Add.ToList().ForEach(x => obj.Add(x.Key, x.Value)); 

など

を試してみました

public static bool AddDict(this Dictionary<string, object> obj, Dictionary<string, object> to_Add) 
    {to_Add.ToList().ForEach(x => obj.Add(x.Key, x.Value));} 

のような拡張機能を持っていると、誰かが

Dictionary<string, object> test=null; 
test.AddDict(oldDictionary); 

のようにそれを使用する場合は、結果の辞書を構築したいです

if (obj == null) 
     obj = (Dictionary<string,object>)to_add; 
else 
     to_Add.ToList().ForEach(x => obj.Add(x.Key, x.Value)); 

しかし、上記のいずれも意図したとおりに機能しませんでした。ブースの方法では、テストディクショナリはnullのようです。 nullの場合、関数内でthis-valueを初期化する方法はありますか?

+2

'List.ForEach'を使用できるようにするために' ToList'を使用するという悪い習慣を取り除きます。元のシーケンスを列挙できるだけの理由で、別のコレクションを作成して埋めています。あなたは 'foreach'ループで既にこれを行うことができます –

+0

' bool'しかし辞書を返さないでください、 –

+0

[最初のコメント] OK、これもオプションです。 ここでは、最高のパフォーマンスを得る方法についてかなり長いスレッドを読んでいます。上のステートメントは選択されたものでした。 [第2のコメント] クール、thats it!しかし、私は本当になぜそれが動作するのかわかりません:/ –

答えて

0

to_Add引数を参照として渡す必要があります。変更しない場合は、テストに影響しません。 Althou、私はそれがextentionメソッドでこの議論に作用するのではないかと疑います。私は新しい辞書を返し、テストを割り当てることをお勧めします。

Dictionary<string, object> test=null; 
test = test.AddDict(oldDictonary); 

しかし、物事は少し後ろです。むしろLinq関数ToDictionaryを使用したいと思います。

+0

'ToDictionary'は非常に異なるセマンティクスを持っています。既存のものを変更するのではなく、新しい辞書を作成します。 – Georg

0

いいえ、これはできません。あなたの関数は辞書の元のポインタのコピーを取得します。これはコピーが同じ要素を指しているので関数を呼び出すときは問題ではありませんが、ポインタを別のインスタンスに変更すると(新しい辞書を割り当てるなど)、この変更は元のポインタには影響しません。

C#には、パラメーターの受け渡しを変更するrefというパラメーター修飾子があります。これにより、実際に最初のtryが実際に動作するようにポインタを変更できるようになります。しかし、それをしようとすると、コンパイラは正しくError CS1101: The parameter modifier 'ref' cannot be used with 'this'を補正します。

したがって、ターゲットオブジェクトがnullであるか、メソッドを通常のメソッドにするかのいずれかの例外を発生させます。私は前者を支持するだろう。

+0

説明ありがとうございます! –

関連する問題