> 文章列表 > C# 特性(翻译草稿)

C# 特性(翻译草稿)

C# 特性(翻译草稿)

先附上链接:Attributes - C# language specification | Microsoft Learn

总览

大部分C#语言内容允许程序员去指定关于程序中定义的特定事宜的声明信息。比如,一个类中的方法的可访问性是通过方法修饰符public,protected,internal and private来指定修饰的。

C#允许程序员创造新的称作特性(attributes)声明信息的类型。程序员可以把特性附着到各种编程实体,并且在运行时环境追溯特性信息。

注意:例如,一个框架可能声明一个指定编程实体的特性(比如类和方法)HelperAttribute,提供一个从他们的编程实体打文档的映射。

特性类是通过特性类来定义的,特性类有positional和named参数。

特性类

一个无论是直接或者间接继承自抽象类System.Attribute,那么它就是一个特性类。特性类的声明定义了一个可以指定程序实体的新特性类型。按照惯例,特性类的命名加一个Attribute后缀。特性类的使用,后缀可要可不要。

一个泛型类的声明不应使用System.Attribute作为直接或者间接的基类。

比如:

public class B : Attribute {}
public class C<T> : B {} // Error – generic cannot be an attribute

AttributeUsage

特性AttributeUsage是用来描述一个特性类是如何使用的。(提前说一下,有三个参数:AttributeTargets, AllowMultiple,Inherit)

AttributeUsage有一个positional参数,允许特性类去指定能够使用的编程实体的类型。

比如:下面的例子定义了一个特性类SimpleAttribute,它只能在累的声明以及接口的声明的位置使用,并且展示了Simple特性的一些用法。

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Interface)]
public class SimpleAttribute : Attribute
{ ... 
}[Simple] class Class1 {...}
[Simple] interface Interface1 {...}

尽管这个特性定义的名字是SimpleAttribute,但是当使用时,这个Attribute的后缀可以去掉,结果就是一个截取后的短名字Simple。因此,上面的例子语义上等同于下面的写法。

[SimpleAttribute] class Class1 {...}
[SimpleAttribute] interface Interface1 {...}

AttributeUsage有一个named参数,称作AllowMultiple,它指示对于一个给定的实体多次指定特性。对于特性类,如果AllowMultiple为true,那么特性类是一个(multi-use attribute class)多使用特性类,并且一个实体中可以多次被指定。如果AllowMultiple为false或者是为定义,那么这个特性类就是单使用特性类(single-use attribute class),并且在一个实体中最多可以指定一次。

比如:下面的例子定义了一个multi-use attribute class 叫做AuthorAttribute并且展示了Author特性的声明的两种使用方法。

[AttributeUsage(AttributeTargets.Class, AllowMultiple = true)]
public class AuthorAttribute : Attribute
{public string Name { get; }public AuthorAttribute(string name) => Name = name;
}[Author("Brian Kernighan"), Author("Dennis Ritchie")]
class Class1 
{...
}

AttributeUsage还有另外一个named参数,称作Inherited