属性,只是元数据或需要

本文关键字:元数据 属性 | 更新日期: 2023-09-27 17:56:28

几天前我问这个属性是什么意思:

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

我了解到属性是元数据,但我不明白的是 - 在这种情况下需要这样做吗?我认为metada就是这样,可以省略的元数据。此外,当我删除属性时,代码似乎运行良好。我想了解。

PS:Hans Passant提到任何关于.NET Csharp的书都涵盖了它。它不是,约翰夏普广泛使用的 VS 2010 没有涵盖它。

属性,只是元数据或需要

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

其他属性控制

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

不,此属性是绝对必需的。它通知 CLR,您定义的内容实际上使用平台调用服务(或 P/Invoke)来调用在非托管代码中定义的函数。

具体来说,RtlZeroMemory函数,在库中定义 kernel32.dll .

没有它,

编译器将不知道它绑定到哪个函数,CLR 将不知道在运行时调用哪个函数。

此属性正在做 2 件事

  • 通知 CLR 正在调用的 C 方法位于内核 32 中.dll
  • 通知 CLR C 方法名称是 RtlZeroMemory,而不是代码中命名的 ZeroMemory。

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

如您的示例所示,在 .NET 编程的几个关键区域中,属性实际上是必需的。

属性提供了一个称为"面向方面的编程"或AOP的模型。不必编写执行某些特定任务(如序列化、DLL 互操作、日志记录等)的代码,而只需使用属性修饰要对其执行这些任务的类或成员。属性是一种特殊类型的类,其成员可在 CLR 运行代码时调用,这些成员将在修饰代码时执行所需的任务。

您部分是正确的;许多属性仅用于存储元数据。DescriptionAttribute是一个很好的属性。但是,即使在这种情况下,属性也很重要,具体取决于它的使用方式。如果要修饰要在设计器中使用的 GUI 类的成员,则 [Description()] 会向设计器中类的用户(可能不是您)提供有价值的信息。我还看到并使用了 DescriptionAttribute 的许多替代用途;它几乎可以应用于任何东西,因此在使用枚举填充下拉列表时,我使用它为 Enum 常量提供"友好名称",并结合 GetDescription() 扩展方法来抓取它们。

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

至于这个特定的属性,我不太确定。 老实说,在将近一年的常量 C# 中,我从未见过它。

但是,属性通常非常有用。 例如,我在VS2010设计器以错误的顺序设置自动完成属性时遇到问题,并因此出现运行时错误。 解决方案是向自动完成属性添加属性,以防止设计器将这些属性写入设计文件,而是在.cs文件中自行设置属性(按正确的顺序)。

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