我有 C/C++ 背景。我通常在我的代码上放置大量断言,而在 C 或 C++ 中,没有保证可以消除对作为断言参数的子表达式的评估。所以我不得不使用宏。
在 C# 中,我没有那种级别的宏支持。但我有Conditional
属性。根据我使用 C 和 C++ 的经验,由于副作用,子表达式不能被消除。
例如,
[Conditional(DEBUG)]
void func1(int a)
{
// Do something.
}
int func2()
{
// Will this be called?
}
func1(func2());
如果func2
仍然被调用,我应该像isDebugMode() && func1(func2())
. 但这是我真正想要避免的。所以我想知道该Conditional
属性是否保证消除子表达式。
如果没有,编写调试构建断言的最佳实践是什么,它将在发布构建时完全剥离?
AFAIK,这是编译器特定的支持。我想知道 Mono 编译器的情况。