1

これはキャプチャの問題だと思いましたが、何も機能しません。ここで単純化してみてください:

foreach (Question question in Test.Questions)
{
  int id= question.id;
  if(someIDictionary.TryGetValue(id, out value)
  { 
    question.answerobject.number=someinteger;
  }
  else
  {
    question.answerobject.number=someotherinteger;
  }
}

質問オブジェクトの一時を作成しようとしましたが、まだ機能していません。すべての結果は常に最後の反復値です。

EDIT: linq to sqlを使用して質問が作成されると、各answerobjectが各questionオブジェクト内に作成されます。質問は IList として返されます。

EDIT 2:別の質問フィールドに値を割り当てても問題は発生しません。問題は answerobject のみです。answerobject の値はすべての質問 (最後の割り当て) で同じです。

4

2 に答える 2

2

あなたが見ている問題は何ですか?「キャプチャ」の問題は、非同期/遅延/スレッド化されたコードにのみ影響します。この場合には影響しません。

ここで最も可能性の高い問題は、すべてのQuestionオブジェクトが同じanswerobjectインスタンスを持っていることなのか、それとも同じQuestionインスタンスを何度も持っていることなのだろうか。


「キャプチャの問題」の図 (コメントを参照): これは、ラムダ/アノン メソッドを使用するときに見られる問題です。反復変数(question上記)がラムダ/アノンメソッドで使用されている場合、それは「キャプチャ」されますが、少し直感に反する方法で...

例えば; これにより、(予測できない順序で) 0 から 9 の数字が出力されることが予想されます。

int[] vals = {0,1,2,3,4,5,6,7,8,9};
foreach(int i in vals) {
    ThreadPool.QueueUserItem(delegate {
        Console.WriteLine(i);
    });
}
Console.ReadLine();

しかし、そうではありません...追加の変数を追加して修正します。

int[] vals = {0,1,2,3,4,5,6,7,8,9};
foreach(int i in vals) {
    int tmp = i;
    ThreadPool.QueueUserItem(delegate {
        Console.WriteLine(tmp);
    });
}
Console.ReadLine();

これは、キャプチャされた変数の動作がレキシカルスコープによって決定されるためです...反復変数のスコープは、私たちが望むよりも少し大きくなっています。

于 2009-04-08T04:58:01.283 に答える
0

この問題は、オブジェクトの作成時に answerobject.number (int?) に「Null」が割り当てられた場合に発生するようです。ループ中に値を割り当てようとすると、上記の問題が発生します。ただし、オブジェクトの作成時に整数を割り当てると、問題はなくなり、ループ中に新しい値を追加できます。わからないので説明してもらえませんか?

于 2009-04-08T17:21:59.873 に答える