【发布时间】:2010-09-07 10:12:53
【问题描述】:
虽然 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# 预处理器吗?有没有一个可以做我想做的简单事情的?
【问题讨论】:
-
您找到了一个好的解决方案吗?在所有地方重复“IsDirty”标志和访问器很糟糕。
-
我没有找到完美的解决方案,但我们通过NotifyPropertyWeaver 使用 IL Weaving 取得了巨大成功。
-
为了它的价值,我编写了一个 C# 预处理器,用于各种目的。我最近在 SO 上通过发布一个简单的“概念验证”C# 预处理器回答了另一个问题:stackoverflow.com/a/18158212/253938
-
试试 T4 模板? hanselman.com/blog/…
标签: c# c-preprocessor