Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/294.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 属性,只是元数据还是必需的?_C#_Attributes - Fatal编程技术网

C# 属性,只是元数据还是必需的?

C# 属性,只是元数据还是必需的?,c#,attributes,C#,Attributes,几天前,我问这个属性是什么意思: [System.Runtime.InteropServices.DllImport("KERNEL32.DLL", EntryPoint="RtlZeroMemory")] public unsafe static extern bool ZeroMemory(byte* destination, int length); 我已经了解到属性是元数据,但我不明白的是——在这种情况下需要这样做吗?我以为metada就是这样,元数据可以被复制。当我删除atti

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

 [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》中使用最多的一本书都没有涉及到它。

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


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

此属性有两个作用

  • 通知CLR正在调用的C方法存在于kernel32.dll中
  • 通知CLR C方法名称为RtlZeroMemory,而不是代码中指定的ZeroMemory

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

至于这个特殊属性,我不太确定。老实说,我已经有将近一年的时间没有见过它了

但是,通常情况下,属性可能非常有用。例如,我在VS2010设计器以错误的顺序设置autocomplete属性时遇到问题,结果导致运行时出错。解决方案是将属性添加到自动完成属性中,以防止设计器将这些属性写入设计文件,而是在.cs文件中自己设置属性(按正确的顺序)


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

不,此属性是绝对必需的。它通知CLR您所定义的实际使用(或P/Invoke)调用非托管代码中定义的函数

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


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

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

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

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


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

“Jon Sharp”-就像这样;)错别字:)修复,谢谢:)是什么让你认为“元数据”意味着“可以省略”?我更好奇的是,如果没有该属性,它是如何工作的,如果它确实有效的话..也许在一般情况下是正确的,但在这个特定情况下不是正确的。这就是为什么我更新它说“(通常)”,尤其是在阅读了其他答案并理解了特定属性的作用之后。我不确定是否有必要投反对票,甚至是一个评论,但很好。这不是我的反对票(我今天的票都用完了)。我只是想提出一个评论,解释为什么它可能被否决(因为这是一个合理的答案;你或其他人可能会感到困惑)。