属性可以向代码元素添加自定义信息。
例如,我们可以使用属性标记一个类已被弃用。
我们还可以标记一个接口是一个web服务的web接口。
属性由继承自抽象类System.Attribute的类定义。
要将属性附加到代码元素,请在代码元素前面的方括号中指定属性的类型名称。
例如,以下代码将 ObsoleteAttribute
附加到Main类:
[ObsoleteAttribute] public class Main { ... }
此属性由编译器识别,并且如果引用了标记为过时的类型或成员,将导致编译器警告。
按照惯例,所有属性类型都以 Attribute
结束。
C#允许您在附加属性时省略后缀:
[Obsolete] public class Main { ... }
ObsoleteAttribute
是在 System
命名空间中声明的类型,如下所示:
public sealed class ObsoleteAttribute : Attribute {...}
C#语言和.NET framework包括多个预定义属性。
属性可以具有参数。
在下面的示例中,我们将 XmlElementAttribute
应用于类。
此属性告诉XMLserializer对象在XML中的表示方式并接受几个属性参数。
以下属性将CustomerEntity类映射到XML元素名为Customer,属于http://www..cn命名空间:
[XmlElement ("Customer", Namespace="http://www..cn")] public class Customer { ... }
属性参数属于两种类型之一:位置或命名。
在里面前面的例子中,第一个参数是位置参数; 第二个是命名参数。
位置参数对应于属性的参数类型的公共构造函数。
命名参数对应于公共字段或公共属性的属性类型。
当指定属性时,我们必须包括对应的位置参数到一个属性的构造函数。
命名参数是可选的。
下面是使用 CLSCompliant
属性指定CLS合规性的示例对于整个装配:
[assembly:CLSCompliant(true)]
可以为单个代码元素指定多个属性。
每个属性都可以列在同一对方括号内,用逗号分隔单独的方括号对。
以下三个示例在语义上是相同的:
[Serializable, Obsolete, CLSCompliant(false)] public class Main {...} [Serializable] [Obsolete] [CLSCompliant(false)] public class Main {...} [Serializable, Obsolete] [CLSCompliant(false)] public class Main {...}
我们可以用三个调用者信息之一来标记可选参数属性。 它们告诉编译器馈送从调用者获得的信息源代码插入参数“s默认值:
[CallerMemberName] applies the caller"s member name
[CallerFilePath] applies the path to caller"s source code file
[CallerLineNumber] applies the line number in caller"s source code file
以下程序中的OneMethod方法演示了所有三个:
using System; using System.Runtime.CompilerServices; class Main { static void Main(){ oneMethod(); } static void OneMethod ( [CallerMemberName] string memberName = null, [CallerFilePath] string filePath = null, [CallerLineNumber] int lineNumber = 0){ Console.WriteLine (memberName); Console.WriteLine (filePath); Console.WriteLine (lineNumber); } }
假设我们的程序驻留在c: source test Program.cs中,输出将是:
Main c:sourcetestProgram.cs 11
C# 迭代器 foreach 语句是枚举器的消费者。迭代器是枚举器的生成器。在这个例子中,我们使用迭代器返回一系列斐波纳契数:using ...
C# 二进制文件的读写 C# 文件的输入与输出BinaryReader 和 BinaryWriter 类用于二进制文件的读写。BinaryReader 类BinaryReader ...
C# do...while 循环 C# 循环不像 for 和 while 循环,它们是在循环头部测试循环条件。do...while 循环是在循环的尾部检查它的条...
C# 文本文件的读写 C# 文件的输入与输出StreamReader 和 StreamWriter 类用于文本文件的数据读写。这些类从抽象基类 Stream 继承...
C# 点阵列(BitArray) C# 集合BitArray 类管理一个紧凑型的位值数组,它使用布尔值来表示,其中 true 表示位是开启的(1),fal...