gpt4 book ai didi

c# - C#中的属性

转载 作者:IT王子 更新时间:2023-10-29 04:02:33 24 4
gpt4 key购买 nike

我知道 C#(以及一般的 .NET)在属性上很重要。然而,尽管我已经用 C# 编程多年,但我发现自己从未使用过它们。有人会让我开始使用它们,并解释在哪里最好使用它们吗?

谢谢

最佳答案

来自 Pro C# 2008 and the .NET 3.5 Platform, Fourth Edition by Andrew Troelsen
理解属性编程
.NET 编译器的作用之一是生成元数据
所有定义和引用类型的描述。除了包含的这个标准元数据
在任何程序集中,.NET 平台为程序员提供了一种嵌入额外
使用属性将元数据转换为程序集。简而言之,属性无非就是代码
可以应用于给定类型(类、接口(interface)、结构等)、成员(属性、
方法等)、组件或模块。
使用属性注释代码的想法并不新鲜。 COM IDL 提供了许多预定义的
允许开发人员描述给定 COM 服务器中包含的类型的属性。
但是,COM 属性只不过是一组关键字。如果 COM 开发人员需要
创建一个自定义属性,他或她可以这样做,但它在代码中被一个 128 位数字引用
(GUID),这充其量是麻烦的。
与 COM IDL 属性(同样只是关键字)不同,.NET 属性是类类型
扩展抽象 System.Attribute 基类。在探索 .NET 命名空间时,您将
找到许多可以在应用程序中使用的预定义属性。此外,
您可以自由地构建自定义属性,以通过创建一个来进一步限定您的类型的行为
从属性派生的新类型。
了解当您在代码中应用属性时,嵌入的元数据本质上是
直到另一个软件明确地反射(reflect)了信息。如果不是这种情况,
嵌入在程序集中的元数据的模糊被忽略并且完全无害。
属性消费者
如您所料,.NET 3.5 Framework SDK 附带了许多实用程序,这些实用程序确实在
寻找各种属性。 C# 编译器 (csc.exe) 本身已预先编程为
在编译周期中发现各种属性的存在。例如,如果 C#
编译器遇到 [CLSCompliant] 属性,它会自动检查属性项
确保它只公开符合 CLS 的结构。再举一个例子,如果 C# 编译器
发现具有 [Obsolete] 属性的项目,它将在
Visual Studio 2008 错误列表窗口。
除了开发工具之外,.NET 基类库中的许多方法都是预编程的
来反射(reflect)特定的属性。例如,如果您希望保持一个状态
对象到文件,您需要做的就是使用 [Serializable] 属性注释您的类。如果
BinaryFormatter 类的 Serialize() 方法遇到这个属性,对象自动
以紧凑的二进制格式保存到文件中。
.NET CLR 也在寻找某些属性的存在。也许最
著名的 .NET 属性是 [WebMethod]。如果您希望通过 HTTP 请求并自动公开方法
将方法返回值编码为 XML,只需将 [WebMethod] 应用到方法和
CLR 处理细节。除了 Web 服务开发之外,属性对于
.NET 安全系统、Windows Communication Foundation 和 COM/.NET 互操作性
(等等)。
最后,您可以自由构建经过编程以反射(reflect)您自己的自定义的应用程序
属性以及 .NET 基类库中的任何属性。通过这样做,您基本上是
能够创建一组特定程序集可以理解的“关键字”。
在 C# 中应用属性
.NET 基类库以各种方式提供了许多属性
命名空间。下面是一些(但绝不是全部)预定义的快照
属性。
预定义属性的小样本
[符合 CLS]
强制注释项符合通用规则
语言规范 (CLS)。回想一下,符合 CLS 的类型是
保证在所有 .NET 编程语言中无缝使用。
[DLL 导入]
允许 .NET 代码调用任何基于 C 或 C++ 的非托管代码
库,包括底层操作系统的API。请注意
与基于 COM 的软件通信时不使用 [DllImport]。
[过时的]
标记已弃用的类型或成员。如果其他程序员尝试使用
这样的项目,他们将收到一个编译器警告,描述错误
他们的方式。
[可序列化]
将类或结构标记为“可序列化”,这意味着它能够持久化
将其当前状态转换为流。
[非序列化]
指定不应保留类或结构中的给定字段
在序列化过程中。
[网络方法]
将方法标记为可通过 HTTP 请求调用并指示 CLR
将方法返回值序列化为 XML。
构建自定义属性
构建自定义属性的第一步是创建一个从 System.Attribute 派生的新类。例子:

// A custom attribute.
public sealed class VehicleDescriptionAttribute : System.Attribute
{
private string msgData;

public VehicleDescriptionAttribute(string description)
{
msgData = description;
}

public VehicleDescriptionAttribute() { }

public string Description
{
get { return msgData; }
set { msgData = value; }
}
}
如您所见,VehicleDescriptionAttribute 维护了一个私有(private)的内部字符串(msgData)
可以使用自定义构造函数设置并使用类型属性(描述)进行操作。
除了这个类派生自 System.Attribute 之外,这个类没有任何独特之处
定义。
出于安全原因,将所有自定义属性设计为密封被认为是 .NET 最佳实践。在
事实上,Visual Studio 2008 提供了一个名为 Attribute 的代码片段,它将转储出一个新的系统。
属性派生类进入您的代码窗口。

关于c# - C#中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/726029/

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