- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我知道 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)
关于c# - C#中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/726029/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!