C# 属性
C# 属性
属性可以向代码元素添加自定义信息。
例如,我们可以使用属性标记一个类已被弃用。
我们还可以标记一个接口是一个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.w3cschool.cn命名空间:
[XmlElement ("Customer", Namespace="http://www.w3cschool.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;/*from w ww . j a va 2s .c om*/
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:\source\test\Program.cs
11
更多建议: