C# VisualStudio:使调试器意识到函数不';t原因“;副作用“;
我有一个对象,我必须通过观察窗口多次观察函数输出。 问题是,我必须在每次执行步骤时按“刷新”按钮,因为“此表达式会产生副作用,并且不会被计算”。 有没有办法用[DoesnotCaseSideeffects]之类的东西来标记函数,这样每次我迈出一步时手表都能自动对其进行评估 我正在VS2008或2010中编写C# 编辑: 这个函数看起来是这样的,正如你所看到的,它不会引起任何副作用。(x,y,z都是双精度)C# VisualStudio:使调试器意识到函数不';t原因“;副作用“;,c#,visual-studio,debugging,C#,Visual Studio,Debugging,我有一个对象,我必须通过观察窗口多次观察函数输出。 问题是,我必须在每次执行步骤时按“刷新”按钮,因为“此表达式会产生副作用,并且不会被计算”。 有没有办法用[DoesnotCaseSideeffects]之类的东西来标记函数,这样每次我迈出一步时手表都能自动对其进行评估 我正在VS2008或2010中编写C# 编辑: 这个函数看起来是这样的,正如你所看到的,它不会引起任何副作用。(x,y,z都是双精度) 不,这是不可能的。函数是否会产生副作用的确定实际上是由特定于语言的表达式计算器进行的 C#
不,这是不可能的。函数是否会产生副作用的确定实际上是由特定于语言的表达式计算器进行的 C#和VB.Net都有不同的EE,并且每种EE都有自己的决定,确定函数是否会引起副作用。一般来说,它们都认为显式函数调用有副作用,并且不会在情况下处理,例如步进,调试器希望禁用副作用。 不过,解决这个问题的最简单方法是使用属性。默认情况下,属性实例不被视为具有副作用,它们将在步骤中进行计算 编辑
想澄清一些误解。调试器或表达式计算器都不会执行任何类型的方法检查来确定函数是否有副作用。他们只是注意到函数的存在,并将其标记为可能有副作用。他们不会试图以任何方式检查方法的代码 您是否尝试过使函数不修改任何类属性或全局变量?我对“副作用”的即兴定义是“在功能执行期间对执行环境所做的更改”。因此,该功能会产生副作用:
void addValues(int operand1, int operand2) {
globalSum = operand1 + operand2;
}
但该函数不:
int addValues(int operand1, int operand2) {
return operand1 + operand2;
}
尽可能避免副作用总是更好的。它们可能会在调试过程中导致问题。请参阅。您可以将
,ac
附加到watch表达式,使其自动刷新值:
x.ToString(),ac
有关更多信息和其他信息,请参见MSDN。如果您包含表达式和/或代码摘录,我们可能会告诉您为什么它会这样想。这不起作用。EE没有试图以任何方式检查该函数,他们只是注意到它不是一个属性,并将其标记为可能有副作用。这个答案似乎完全不正确。看看下面的答案;您可以将
,ac
附加到watch表达式,它将强制调试器自动重新计算它。@Jez“变通”不是通用的。它确实适用于C#,但不适用于VB.NET所有不使用VB.NET的更多原因;-)
x.ToString(),ac