在过去的四五年里,我基于许多使用 C# 属性的设计和框架。

但最近我看到许多人公开劝阻它们的使用或更改其框架以减少对它们的需求或使用。

我发现它们是天赐之物,但现在我开始想知道我错过了什么。

澄清:使用约定优于配置正在成为要遵循的主要原则,尤其是在 ORM 领域。在此区域中,您可以使用配置文件 (XML) 映射字段、使用属性或使用直接映射到数据库表中的字段的通用命名约定。我没有任何参考文献可以引用,但我读到了一些反对添加另一个属性的强烈反对意见。

但我觉得我刚刚列出的三个选择仍然是属性最有意义。配置文件更难维护,并且通用的命名约定将您与数据库字段的实现联系起来。属性准确地放置在需要的地方,并且可以在不脱离使用位置的情况下更改实现。

有帮助吗?

解决方案

属性实际上有两个用途:作为用户可见的事物,以及由编译器发出的事物。

我假设您正在谈论用户可见的属性。

总的来说,我想说用户可见的属性并不理想。

大多数时候,它们用于在 C# 之上嵌入某种形式的自定义语言。DLINQ 属性就是一个很好的例子。从消费者的角度来看,更好的方法是为宿主语言添加一流的支持。那最终会感觉更自然。(拥有定义表和外键的语言支持会比所有疯狂的 linq-to-sql 属性更容易使用)。

然而实际上,扩展编程语言对于大多数开发人员来说成本太高。好处并没有超过成本。

也许有一天 C# 将具有元编程功能,这将使做这类事情变得容易。

然而,目前这种能力还不存在。

这给你留下了 3 个选择:

  1. 使用属性
  2. 使用动态语言,并在运行时生成代码
  3. 只是不要使用生成式编程

通常,#1 最终是最容易做出的选择,即使它并不理想。

其他提示

这是一个很难的问题,得到了一般的答案。属性是另一种语言功能正常使用时是非常可怕的,但确实有滥用的可能。我还没有见过一个令人信服的理由完全转储属性的使用,真的没有理由认为他们是一个坏主意。

在事实上正好相反的是真实的。属性允许添加框架的具体信息到元数据。信息根本无法很容易地通过一个类型层次表达。这大大增加了使用属性框架的力量。

我当然见过或两种实现人们滥用他们一点,但没有壮观。你可以说得更详细点吗?你正在谈论有特定的属性/框架。

这是一个非常宽泛的问题,比如“我应该把奶酪在我的砂锅”;这个问题的答案都为“这取决于你正在做什么。”

如果你正在做大量使用addributes和使用它们几乎像一个声明式编程范式,那么你很可能会碰上沿途的麻烦。无论是来自于反射或只是一般的维护地方经济放缓是谁也说不准。

这就像一切......使用他们时,他们适当的,使你的代码更有效或可读。不要使用它们使用它们的缘故,并没有放弃他们放弃他们的缘故。

我觉得他们非常有用,当谈到定义我的码元数据。我用它们来生成自定义报告,对于插入式架构,以及用于向第三方代码通信。

我想你可以按照惯例做的一切,但我喜欢他们。

我看到大量使用在ASP.NET MVC属性的。事实上,切换到MVC的缘故,我显著提高我使用属性的。我不知道您的防属性反弹的看法是从哪里来的,但我肯定看不到它从MS,至少相对于MVC。

我特别喜欢属性可以被用来提供跨如此装饰那些控制器/动作交叉行为(方面)的方式。眼看MVC是如何构建的处理之前和行动之后调用属性调用,我必须相信,这是获得方面的MVC工作的首选方式。

那么,如果ASP.NET MVC是什么去了,我说不用担心。这么多是在此框架内使用反射和属性,我看不出有任何的问题做。 MVC是一个相当新的框架,并且在使用它所有的地方。从验证输入,处理错误,到非常真棒ActionFilter属性,还有很多人。所以,不,我个人认为没有错他们。

我个人认为属性,最喜欢的语言特点,有自己的位置,但可能会被滥用或误用。

在正确的框架,它们是非常宝贵的。他们绝对简化像DI框架的东西( MEF 是一个很好的例子),并且是非常,非常有用之类的东西测试框架。

我觉得要疯加入用户定义属性可以是矫枉过正,但是。我个人喜欢使用属性,但尽量它们的使用保持在最低限度,只有他们最有意义地使用它们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top