Атрибут Conditional также устраняет подвыражения?

У меня есть опыт работы с 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.


person eonil    schedule 31.07.2013    source источник


Ответы (4)


func2 не будет вызываться. Это указано в Спецификации языка C#, поэтому компилятор Mono должен действовать в соответствии с этими правилами.

MSDN http://msdn.microsoft.com/en-us/library/aa664622(v=vs.71).aspx:

Атрибут Conditional позволяет определять условные методы. Атрибут Conditional указывает условие, проверяя символ условной компиляции. Вызовы условного метода либо включаются, либо опускаются в зависимости от того, определен ли этот символ в точке вызова. Если символ определен, вызов включен; в противном случае вызов (включая оценку параметров вызова) опускается.

person empi    schedule 31.07.2013


Линия

func1(func2());

будет удален, если DEBUG == false

person a-ctor    schedule 31.07.2013

В c# тоже есть макросы, но они отличаются от c++.

Вы можете объявить макрос в Conditional Compilation Symbols и проверить их так

#if MACRO
#endif

Здесь вы можете прочитать документацию о их.

Надеюсь, поможет.

person superarce    schedule 31.07.2013