C# 属性

2018-01-22 17:09 更新

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
以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号