前几天我问过这个属性意味着什么:
[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并没有涵盖它。答案 0 :(得分:2)
元数据通常有原因和意义。在这种特殊情况下,它告诉编译器如何绑定此外部方法定义(例如,它与哪个DLL导入匹配)。
其他属性控制框架如何执行互操作,而其他属性控制对象检查器如何显示数据。第三方属性也广泛用于控制各种行为,例如在执行反射时查找特定类型信息。
答案 1 :(得分:1)
这个属性正在做两件事
是的,此属性是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文件中设置属性(按正确顺序)。
摘要:属性(通常)不是必需,但可以证明非常有用。