属性,只是元数据或需要?

时间:2011-05-12 14:53:01

标签: c# attributes

前几天我问过这个属性意味着什么:

 [System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")]  public unsafe static extern bool ZeroMemory(byte* destination, int length); 

我了解到属性是元数据,但我不明白的是 - 在这种情况下需要这个吗?我认为metada只是那个,可以省略的元数据。当我删除attibute时,代码似乎运行正常。 我想了解。

PS:Hans Passant在任何有关.NET Csharp的书中都提到了它。但事实并非如此,John Sharp的大部分使用的VS 2010并没有涵盖它。

5 个答案:

答案 0 :(得分:2)

元数据通常有原因和意义。在这种特殊情况下,它告诉编译器如何绑定此外部方法定义(例如,它与哪个DLL导入匹配)。

其他属性控制框架如何执行互操作,而其他属性控制对象检查器如何显示数据。第三方属性也广泛用于控制各种行为,例如在执行反射时查找特定类型信息。

答案 1 :(得分:1)

这个属性正在做两件事

  • 通知CLR被调用的C方法存在于kernel32.dll
  • 通知CLR C方法名称是RtlZeroMemory而不是ZeroMemory,因为它在代码中命名。

是的,此属性是100%必需的。任何PInvoke方法都要求至少命名C方法所在的DLL。

答案 2 :(得分:1)

不,这个属性是绝对必需的。它通知CLR您定义的内容实际上使用platform invokation services(或P / Invoke)来调用非托管代码中定义的函数。

具体而言,RtlZeroMemory函数,在库kernel32.dll中定义。

没有它,编译器就不知道它绑定了哪个函数,并且CLR不知道在运行时调用哪个函数。

答案 3 :(得分:0)

正如您的示例所示,.NET编程的几个关键领域实际上需要属性。

属性提供称为“面向方面编程”或AOP的模型。您无需编写执行某些特定任务的代码(例如序列化,DLL互操作,日志记录等),而是简单地使用属性修饰您希望执行这些任务的类或成员。属性是一种特殊类型的类,其成员可以在运行代码时由CLR调用,这将在您修饰代码时执行所需的任务。

你是正确的;许多属性仅用于存储元数据。 DescriptionAttribute是一个很好的。但是,即使在这种情况下,该属性也很重要,具体取决于它的使用方式。如果要装饰要在设计器中使用的GUI类的成员,[Description()]会为设计器中的类用户提供有价值的信息,这可能不是您。我也看过并使用了DescriptionAttribute的许多替代用法;它可以应用于几乎任何东西,所以我使用它为Enum常量提供“友好名称”,再加上GetDescription()扩展方法来抓取它们,当使用Enums填充下拉列表时。

因此,虽然它在技术上是“元数据”,但“必需”属性取决于您希望执行该属性中固有的任务的数量。

答案 4 :(得分:-1)

至于这个特殊的属性,我不太确定。老实说,我几乎一年没见过C#。

但是,一般来说属性可以证明非常有用。例如,我遇到的问题是VS2010设计器以错误的顺序设置自动完成属性,并因此导致运行时错误。解决方案是向自动完成属性添加属性,阻止设计人员将这些属性写入设计文件,而是自己在.cs文件中设置属性(按正确顺序)。

摘要:属性(通常)不是必需,但可以证明非常有用。