![]() |
1
11
考虑一下面向方面的解决方案,比如 PostSharp ,根据自定义属性在事实之后插入代码。它与预编译程序相反,但可以为您提供所需的功能(属性更改通知等)。 |
![]() |
2
6
您总是可以使用C预处理器——C足够接近,语法方面。M4也是一种选择。 |
![]() |
3
4
我知道很多人认为短代码等于优雅的代码,但事实并非如此。 您提出的示例在代码中得到了完美的解决,正如您所展示的那样,您需要一个预处理器指令来做什么?您不想“预处理”您的代码,您希望编译器在您的属性中为您插入一些代码。这是普通代码,但这不是预处理器的目的。 以你的例子,你把极限放在哪里?很明显,这满足了一个观察者模式,毫无疑问这将是有用的,但是有很多事情是有用的,因为代码提供了 灵活性 其中预处理器没有。如果您试图通过预处理器指令实现通用模式,那么您将以一个预处理器结束,该预处理器需要与语言本身一样强大。如果你想 使用预处理器指令以不同的方式处理代码 但是如果你只是想要一个代码片段,那就另辟蹊径吧,因为预处理器不是故意这样做的。 |
![]() |
4
3
不为C构建预处理器的主要论点是在Visual Studio中集成:要使IntelliSense和新的后台编译无缝工作,需要付出很多努力(如果可能的话)。 替代方法是使用Visual Studio生产力插件,如 ReSharper 或 CodeRush . 据我所知,后者有一个无与伦比的模板系统,并且具有出色的 refactoring 工具。
另一件有助于解决您所指问题的确切类型的事情是AOP框架,例如
PostSharp
.
|
![]() |
5
2
使用C++风格的预处理器,可以将OP的代码简化为这一行:
可观察的属性大致如下:
如果你有100个属性需要处理,那大约是1200行代码,而不是100行。哪个更容易阅读和理解?哪个更容易写? 使用C,假设您剪切和粘贴以创建每个属性,即每个属性8次粘贴,总共800次。使用宏时,根本不粘贴。哪个更可能包含编码错误?如果您必须添加ISdirty标志,哪一个更容易更改? 当大量情况下可能存在自定义变体时,宏没有那么有用。 与任何工具一样,宏也可能被滥用,甚至在错误的手中也可能是危险的。对于一些程序员来说,这是一个宗教问题,一种方法相对于另一种方法的优点是不相关的;如果是您,则应避免使用宏。对于我们这些经常、熟练、安全地使用非常锋利的工具的人来说,宏不仅可以在编码时立即提高生产率,还可以在调试和维护期间提供下游的生产率。 |
![]() |
6
1
要获取当前执行的方法的名称,可以查看堆栈跟踪:
当您在属性集方法中时,名称是set_property。 使用相同的技术,您还可以查询源文件和行/列信息。 但是,我没有对其进行基准测试,为每个属性集创建一次StackTrace对象可能太耗时了。 |
![]() |
7
1
我认为在实现inotifyPropertiesChanged时,您可能遗漏了问题的一个重要部分。您的消费者需要一种确定物业名称的方法。因此,应该将属性名定义为常量或静态只读字符串,这样使用者就不必“猜测”属性名。如果使用预处理器,使用者如何知道属性的字符串名称?
|
![]() |
8
0
如果我设计下一个版本的C,我会想到每个函数都有一个自动包含的局部变量,其中包含类名和函数名。在大多数情况下,编译器的优化器会将其取出。 不过,我不确定这类东西有多大需求。 |
![]() |
9
0
有趣。我并不认为预处理器必须这样工作。在提供的示例中,我正在执行一个简单的文本替换,它与上的预处理器定义一致。 Wikipedia . 如果这不是预处理器的正确使用,我们应该称之为简单的文本替换(通常需要在编译之前发生)吗? |
![]() |
10
0
至少对于提供的场景,有一个比构建预处理器更干净、类型安全的解决方案: 使用泛型。像这样:
这可以很容易地扩展为返回
因为它是一个
(我知道这是个老问题,但我发现它缺乏实际的解决办法。) |
![]() |
11
-1
|
![]() |
Timo · 如果宏变量后跟构成有效标识符的字符,则不会展开宏变量 6 年前 |
![]() |
user3623498 · 在#if中更改变量时出现问题 6 年前 |
![]() |
einpoklum · 来自#cmakedefine替换的意外结果 7 年前 |
![]() |
Joseph Franciscus · C中预处理器方法的别名++ 7 年前 |
![]() |
stoper · 防止同一宏在多个转换单元中具有不同的定义 7 年前 |
![]() |
СеÑгей · MinGW中预处理器g++的奇怪行为 7 年前 |