问题 何时使用属性而不是属性?


是否有特定情况应该在类而不是属性上使用自定义属性? 我知道属性是可取的,因为它们的发现性和性能,但属性......我什么时候应该 无疑 使用它们?

更新:

这里 是Eric Lippert关于这个决定的帖子。


9874
2018-02-16 07:17


起源



答案:


Eric Lippert有一个 很棒的博文 完全解决这个决定。

他的总结是:

简而言之:使用属性来描述您的机制,使用属性来建模域。

我还要考虑到属性值实际上是静态的 - 换句话说,它是类型描述的一部分,而不是类型的任何实例。

当某个基类型的每个实例都必须具有属性(例如描述)但是不同的具体派生类型想要基于每个类型而不是每个实例指定描述时,可能会出现一个棘手的位。你经常会得到总是返回常量的虚拟属性 - 这并不是非常令人满意。我怀疑德尔福的课程参考 威力 在这帮助......不确定。

编辑:举一个机制的例子,如果你装饰一个类型来说明它来自数据库中的哪个表,那就是描述数据传输机制,而不是说任何有关正在传输的数据模型。


13
2018-02-16 07:22



Jon,你能从.NET框架中广泛使用的部分带来一个“描述机制”的例子吗? - Valentin
您可能正在编辑您的问题,但您可以添加指向博客帖子的链接: blogs.msdn.com/ericlippert/archive/2009/02/02/... - VonC
@Valentin:[Serializable] - David Schmitt
@David Schmitt - 好吧,[Serializable]是一个例外,因为它是由编译器处理的,而不是运行时(它是一个CLI标志)。大多数System.ComponentModel都会这样做,就像任何序列化器一样。 - Marc Gravell♦
弄它 - 我可以发誓我加入了链接!当我在办公室时会解决。 - Jon Skeet


答案:


Eric Lippert有一个 很棒的博文 完全解决这个决定。

他的总结是:

简而言之:使用属性来描述您的机制,使用属性来建模域。

我还要考虑到属性值实际上是静态的 - 换句话说,它是类型描述的一部分,而不是类型的任何实例。

当某个基类型的每个实例都必须具有属性(例如描述)但是不同的具体派生类型想要基于每个类型而不是每个实例指定描述时,可能会出现一个棘手的位。你经常会得到总是返回常量的虚拟属性 - 这并不是非常令人满意。我怀疑德尔福的课程参考 威力 在这帮助......不确定。

编辑:举一个机制的例子,如果你装饰一个类型来说明它来自数据库中的哪个表,那就是描述数据传输机制,而不是说任何有关正在传输的数据模型。


13
2018-02-16 07:22



Jon,你能从.NET框架中广泛使用的部分带来一个“描述机制”的例子吗? - Valentin
您可能正在编辑您的问题,但您可以添加指向博客帖子的链接: blogs.msdn.com/ericlippert/archive/2009/02/02/... - VonC
@Valentin:[Serializable] - David Schmitt
@David Schmitt - 好吧,[Serializable]是一个例外,因为它是由编译器处理的,而不是运行时(它是一个CLI标志)。大多数System.ComponentModel都会这样做,就像任何序列化器一样。 - Marc Gravell♦
弄它 - 我可以发誓我加入了链接!当我在办公室时会解决。 - Jon Skeet


有两种用例:

1)使用其他人定义的自定义属性,例如可以在Main方法上使用的System.LoaderOptimization属性。这些类型的属性用于指导平台代码(如CLR,WPF,WCF或调试器)以某种方式运行代码,并且有时非常有用。阅读各种平台主题的书籍是学习何时以及如何使用这些属性的好方法。

2)创建自己的自定义属性并使用它来装饰类(或方法,属性等)。除非您还拥有使用Reflection注意那些属性用法并以某种方式更改行为的代码,否则它们无效。应尽可能避免这种用法,因为性能非常差,比访问类的静态成员大几个数量级。


0
2018-02-16 07:29