gpt4 book ai didi

用于信息或导入外部函数的 C# 属性?

转载 作者:太空狗 更新时间:2023-10-30 01:29:04 24 4
gpt4 key购买 nike

我对 C# 对属性的使用有点困惑。起初我以为它只是通过使用 [Obsolete] attribute 来为程序代码提供附加信息。 .现在我发现 [Dllimport]可用于导入动态链接库及其函数。属性可以导入.exe文件和其他类型的文件吗?

最后一个问题,对于每天在 C# 中工作的程序员,您使用属性有多少,除了扩展信息和导入 dll 之外,您是否将其用于其他用途?

最佳答案

简单地说,属性只是附加到类或方法的最基本的元数据。

但是,编译器 会通读您的代码,并针对它遇到的特定属性运行特定的操作,并将其硬编码到代码中。例如,当它找到一个 DllImportAttribute在一个方法上,它将把它解析为一个外部符号(同样,这是一个非常简化的解释)。当它找到 ObsoleteAttribute 时, 它会发出弃用警告。

您自己的属性(you can create 具有从 Attribute 基类继承的类)不会对默认编译器产生影响。但是您(或其他库)也可以在运行时扫描它们,从而打开许多可能性并引出您的第二个问题:

我通常使用它们进行元编程。例如,想象一个自定义网络服务器处理特定格式的数据包,在不同的类中实现。每种数据包格式都是通过读取一个整数值来识别的。现在我需要找到正确的类来实例化该整数。

  • 我可以用 switch..case 或字典映射 integer -> packet 来做到这一点,每次我添加一个数据包时我都会扩展它,但这很难看,因为我必须接触可能远离实际 Packet 类的代码每当我添加或删除数据包。我什至可能不知道开关或字典,以防服务器是在另一个组件而不是我的数据包中实现的(模块化/可扩展性)!
  • 相反,我创建了一个自定义 PacketAttribute,存储通过属性设置的整数属性,并用它装饰我的所有 Packet 类。服务器只需要在启动时扫描我的程序集类型(通过反射)并自动构建整数字典 -> 数据包对。当然,我可以在每次需要数据包时扫描我的程序集,但这在性能方面可能有点慢。

有些 API 的属性重得多,例如 controllers in ASP.NET Core :您将完整的请求 URL 映射到处理程序类中的方法,然后执行服务器代码。甚至 URL 参数也以这种方式映射到参数。

调试器 也可以使用属性。例如,用 DebuggerDisplayAttribute 装饰一个类允许您提供在 Visual Studio 中检查类实例时显示的自定义字符串,该字符串具有特定格式,可以直接显示重要成员的值。

您可以看到,如果使用得当,属性会非常强大。评论提供更多引用! :)

关于用于信息或导入外部函数的 C# 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54717839/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com