日期:2014-05-17 浏览次数:21204 次
这是今天上午我在MonoDeveloper中尝试使用#define时注意到的问题:
C#貌似并不支持#define宏命令。
这是为什么呢?
在这篇文章里,我找到了答案。
于是将它翻译一遍,
希望能帮助跟我一样对此有困惑的朋友。
在C++中,我们可以这样定义一个宏命令:
#define PRODUCT(x,y,z) x*y*z
然后就可以这样写了:
int a = PRODUCT(3,2,1);
但是C#中并不可以这样做。为什么呢?
有很多原因,最重要的一点是可读性。
使用C#进行设计的一个最主要的目标是保持代码可读。但是通过使用宏命令,程序员可以创建他们自己的语言——
但是这与代码本身并没有太大关联。为了理解代码在干什么,用户不只需要知道语言是怎样工作的,同样也需要知道#define宏命令的具体含义。这大大降低了代码的可读性。
在C#中,你完全可以使用方法来代替宏命令。——并且无需担心它们的运行效率,因为JIT(即时编译器)会帮你搞定这一切,
让你用的放心,舒心与安心。
除此之外,还有一点细节方面的问题。
因为宏定义是使用文字义的,这意味着如果我这样写:
int y = PRODUCT(1 + 2,3 + 4,5 + 6);
我想得到的是3*7*11 = 231,但是事实上,
宏定义这个笨孩子只是简单的将这句语句理解成了这个样子:
int y = 1 + 2*3 + 4*5 + 6;
你猜结果是多少?32!哦,不对,我算错了:-P,是33!!!
当然,可以使用括号来避免这个问题,但是程序员总有犯大姨妈的时候,一不小心就会掉进这个笨孩子的陷阱里了。
(剩余部分是C#中有关条件编译的一些符号,
在这里就不赘述了,
如果感兴趣的话猛戳这里)
Translated by Elezor in Tianjin.
2013/1/25