Visual Studio:让调试器意识到函数不会导致“副作用”

时间:2009-06-26 16:15:54

标签: c# visual-studio debugging

我有一个对象,我必须通过观察窗口观看很多次的功能输出。 问题是每次我都要按下刷新按钮,因为“这个表达式导致副作用而且不会被评估”。 有没有办法用[DoesNotCauseSideEffects]标记一个函数,这样每当我迈出一步时,手表会自动评估它?

我在VS2008或2010中编写C#。

修改 该函数看起来像这样,并且正如您所看到的那样,不会产生任何副作用。(x,y,z都是双倍的)

public override string ToString()
{
    return "{ " + x.ToString(".00") + ", " + y.ToString(".00") + ", " + z.ToString(".00") + "}";
}

3 个答案:

答案 0 :(得分:20)

您可以将,ac附加到监视表达式,以使其自动刷新值:

x.ToString(),ac

有关详情和其他format specifiers,请参阅MSDN。

答案 1 :(得分:3)

不,这是不可能的。确定函数是否具有副作用实际上是由语言特定表达式评估者做出的。

C#和VB.Net都有不同的EE,每个都有自己的决定,是否一个函数不会引起副作用。一般来说,他们都认为显式函数调用有副作用,并且不会在调试器想要禁用副作用的情况下处理它们,例如步进。

解决这个问题最简单的方法是使用属性。默认情况下,属性实例不被视为具有副作用,并且它们将在步骤中进行评估。

修改

想要澄清一些误解。调试器或表达式计算器都不会进行任何方法检查以确定函数是否具有副作用。他们只是注意到一个功能的存在,并将其标记为可能有副作用。他们不会以任何方式尝试检查方法的代码。

答案 2 :(得分:-2)

您是否尝试过这样做,以便该函数不会修改任何类属性或全局变量?我对“副作用”的袖口定义是“在执行函数期间对执行环境的更改”。所以这个功能会引起副作用:

void addValues(int operand1, int operand2) {
  globalSum = operand1 + operand2;
}

但是这个功能没有:

int addValues(int operand1, int operand2) {
  return operand1 + operand2;
}

尽可能避免副作用总是更好。它们可能会导致调试问题。请参阅this wikipedia article