C#中的属性

时间:2009-04-07 14:31:30

标签: c# .net attributes

我知道C#(和.NET一般)在属性上很重要。然而,尽管我已用C#编程多年,但我还没有发现自己曾经使用它们。有人会让我开始使用它们,并解释哪些是最好的使用它们?

由于

8 个答案:

答案 0 :(得分:33)

答案 1 :(得分:7)

属性在针对其他程序员或程序的不同部分之间的代码中得到更多使用,而不是针对最终用户的代码。

例如,您可以使用属性来导入dll,指示类型如何与visual studio交互(设计器可见,智能感知帮助,调试器步进等),如何序列化它们,指示类型已过时,描述默认值,描述,处理COM访问等

这些对于最终用户来说基本上是不可见的,并且单个程序员可以将其他地方放在源代码中。但是当只有编译的二进制文件可用而不是源代码时,它们才有用。

答案 2 :(得分:4)

我喜欢将属性用作代码的元数据。我们创建了一些简单的属性,让我们标记谁编写了什么代码,时间和原因。这使我们在代码和运行时都有记录的变化。如果在运行期间有任何异常,我们可以检查callstack,查看方法中的任何属性,并追踪负责人:

[Author("Erich", "2009/04/06", Comment = "blah blah blah")]
public void MyFunction()
{
...
}

当然,我们可以使用我们的源代码控制来查看谁检查了哪些代码,但我发现这些信息可以在您需要的地方提供更多信息。此外,如果我们更改了源代码管理,那么该信息不会丢失,因为它会保留在代码中。

答案 3 :(得分:2)

属性是声明性编程的一种形式,与在XAML中创建UI“类似”。它标记了具有属性的代码片段(类,方法,属性等),以便您以后可以收集所有以特定方式标记的片段,然后对所有这些片段进行标准化。

EG。考虑每次启动应用时都要运行一些代码段的方案。在一个编程模型(非属性)中,您将转到main方法并显式调用这些init方法。使用属性,您只需收集您使用'init'属性标记的所有方法,并通过反射调用它们。

同样的模式适用于序列化,持久性和诸如此类的行为......

答案 4 :(得分:1)

我相信你的意思是你不使用(或经常使用)自定义属性?

在我目前的项目中,我大量使用自定义属性,但是,您需要牢记在心,这就是使用属性本身不应成为目标。

这是达到给定解决方案的工具/目的。

我有时会将自定义属性与像PostSharp这样的编织器一起使用来修饰应该在编译时应用一些编织的方法。

在我目前的项目中,我还使用属性来装饰某些类型以及其他信息...但我相信我之前在此发布了这个: Cool uses of Attributes or Annotations (CLR or Java)?

答案 5 :(得分:1)

我使用以下属性:

  • 与插件架构进行通信
  • 告诉另一个框架如何处理代码(例如NUnit)
  • 添加元数据以供其他代码使用(请参阅PropertyGrid)
  • 将对象映射到数据库(请参阅Castle ActiveRecord)
  • 编写自己的API以允许用户传达元数据时
  • 在框架代码中告诉调试器跳过它

这些都是我的头脑。我在很多其他地方使用它们

答案 6 :(得分:0)

属性非常擅长描述代码的某些运行时行为,这些行为与所讨论的代码是正交的。例如,在一个名为Customer的类中,您将为客户建模,对吧?但您可能不想建模或描述Customer对象的序列化方式。

向Customer类添加属性允许您告诉运行时的其他部分它应该如何处理您的客户。

MSTest和NUnit利用属性告诉测试框架它应该如何使用定义测试夹具的类。

ASP.NET MVC使用属性告诉mvc框架它应该将哪些方法视为控制器操作。

因此,任何您希望为属性建模的运行时行为的地方都很有用。

答案 7 :(得分:-1)

类属性定义可在此处获取

ClassInterfaceAttribute:表示如果生成接口,则为公开给COM的类生成的类接口的类型。

ComDefaultInterfaceAttribute:指定要向COM公开的默认接口。这个类不能被继承。

ComVisibleAttribute:控制单个托管类型或成员或程序集中所有类型的可访问性到COM。