虽然C#规范确实包含预处理器和基本指令(#define,#if等),但该语言没有与C/C++等语言相同的灵活预处理器.我认为缺乏这种灵活的预处理器是由Anders Hejlsberg做出的设计决定(尽管不幸的是,我现在找不到这个参考).根据经验,这肯定是一个很好的决定,因为当我做很多C/C++时,会创建一些非常糟糕的不可维护的宏.
也就是说,有很多场景我可以找到一个稍微灵活一点的预处理器.一些简单的预处理器指令可以改进以下代码:
public string MyProperty { get { return _myProperty; } set { if (value != _myProperty) { _myProperty = value; NotifyPropertyChanged("MyProperty"); // This line above could be improved by replacing the literal string with // a pre-processor directive like "#Property", which could be translated // to the string value "MyProperty" This new notify call would be as follows: // NotifyPropertyChanged(#Property); } } }
编写预处理器来处理这样极其简单的情况会不是一个好主意?Steve McConnell在Code Complete中写道(p208):
编写自己的预处理器 如果一种语言不包含预处理器,那么编写一个很容易...
我被撕裂了.将这样一个灵活的预处理器从C#中取出是一个设计决定.但是,我非常尊重的作者提到它在某些情况下可能没问题.
我应该构建一个C#预处理器吗?有没有可以做我想做的简单事情?
考虑一下面向方面的解决方案,比如PostSharp,它根据自定义属性在事实之后注入代码.它与预编译器相反,但可以为您提供所需的功能(PropertyChanged通知等).
我应该构建一个C#预处理器吗?有没有可以做我想做的简单事情?
你总是可以使用C预处理器 - C#足够接近,语法方面.M4也是一种选择.