日期:2014-05-17  浏览次数:21157 次

【2013.1.25】 为什么C#不支持宏命令

这是今天上午我在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


1楼Elezeor6天前 12:19
转载不用注明出处,不过可以加上这条语句:nConsole.Writeline("Thank you,Mr.Elezor");