这是捕获问题吗?我仍然无法解决

时间:2009-04-08 04:44:01

标签: c# capture

我认为这是一个捕获问题,但我没有做任何事情。试着在这里简化:

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;
  }
}

我尝试为问题对象设置临时值,但仍然无法正常工作。所有结果总是最后一次迭代值。

编辑: 每个问题对象中都会创建每个答案对象,因为问题是使用l​​inq to sql创建的。那么问题将作为IList返回。

编辑2:如果我将值分配给另一个问题字段,则不会出现此问题。问题仅在于答案对象。对于所有问题(最后一项任务),答案对象的值都是相同的。

2 个答案:

答案 0 :(得分:2)

你看到的问题是什么? “捕获”问题仅影响异步/延迟/线程代码 - 它不应影响这种情况。

我想知道这里最可能出现的问题是你的所有Question个对象都有相同的answerobject个实例 - 或者甚至你有很多次Question个实例。


“捕获问题”的说明(见注释):这是使用lambda / anon方法时遇到的问题;如果在lambda / anon方法中使用了迭代变量(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();

这是因为捕获变量的行为是由它们的词法范围决定的......迭代变量的范围比我们想要的要大一些。

答案 1 :(得分:0)

当创建对象时,answerobject.number(int?)被指定为“Null”时,似乎会出现此问题。如果我尝试在循环期间分配值,我会得到上面的问题。如果我在创建对象时分配一个整数,问题就消失了,然后我可以在循环期间添加新值。你能解释一下,因为我得不到它。