3.9C#引用类型之特性(Attribute)

1.特性声明

所有特性类都直接或间接派生自 System.Attribute 基类。

以下示例声明了 HelpAttribute 特性。

using System;

public class HelpAttribute : Attribute
{
    string _url;
    string _topic;

    public HelpAttribute(string url) => _url = url;

    public string Url => _url;

    public string Topic
    {
        get => _topic;
        set => _topic = value;
    }
}

2.调用特性

调用特性时,通过用方括号 ([]) 将特性名称以及实参括起来,并置于应用该特性的实体的声明上方。可以将多个特性附加到实体的声明上。对于给定实体,一些特性可以指定多次。

按位置传递的参数与特性构造函数的参数相对应,按命名传递的参数与该特性的属性或字段相对应。

如果特性的名称以 Attribute 结尾,那么可以在调用特性时省略 Attribute

[Help("http://msdn.microsoft.com/.../MyClass.htm")]
public class Widget
{
    [Help("http://msdn.microsoft.com/.../MyClass.htm", Topic = "Display")]
    public void Display(string text) {}
}

3.特性目标

默认情况下,特性应用于紧跟在它后面的元素。特性目标是显式的指定此特性应用于哪个目标。

[target : attribute-list]

NonSerializedAttribute 只能附加到字段,不能附加到属性。可使用特性上的 field: 说明符将 NonSerializedAttribute 附加到 Id 属性的支持字段,如下例所示:

public class Person
{
    public string FirstName { get; set; }

    public string LastName { get; set; }

    [field:NonSerialized]
    public int Id { get; set; }

    public string FullName => $"{FirstName} {LastName}";
}
target值应用场景
assembly整个程序集
module当前程序集模块
field类或结构中的字段
event事件
method方法或 get 和 set 属性访问器
param方法参数或 set 属性访问器参数
property属性
return方法、属性索引器或 get 属性访问器的返回值
type结构、类、接口、枚举或委托

4.特性命名

特性的命名按照PascalCase + Attribute方式,虽然编译器不强制带Attribute结尾,但这是良好的编码习惯。

但是,如果两个短名称相同,并且一个类型名称包含 Attribute 后缀而另一类型名称不包含,则会出现命名冲突。可以使用 @ 字符指定是调用全名。

using System;

[AttributeUsage(AttributeTargets.Class)]
public class Info : Attribute
{
   private string information;

   public Info(string info)
   {
      information = info;
   }
}

[AttributeUsage(AttributeTargets.Method)]
public class InfoAttribute : Attribute
{
   private string information;

   public InfoAttribute(string info)
   {
      information = info;
   }
}


// Generates compiler error CS1614. Ambiguous Info and InfoAttribute.
[Info("A simple executable.")] 
// Prepend '@' to select 'Info' ([@Info("A simple executable.")]). Specify the full name 'InfoAttribute' to select it.
public class Example
{
   [InfoAttribute("The entry point.")]
   public static void Main()
   {
   }
}

原创文章,作者:huoxiaoqiang,如若转载,请注明出处:https://www.huoxiaoqiang.com/csharp/csharplang/11487.html

(0)
上一篇 2021年3月8日 05:37
下一篇 2021年3月10日 20:35

相关推荐

  • 5.1C#异步编程运行机制

    C#语言的异步编程是基于任务的异步编程(Task Asynchronous Programming,简写TAP)模型,该模型的核心是 Task 和 Task<T> 对象以及 async 和 await 关键字。 1.异步方法声明…

    C#语言教程 2021年5月1日
    01900
  • 3.10C#引用类型之委托(Delegate)

    委托类型派生自 System.Delegate 类。 1.委托声明 委托 表示对具有 特定参数列表 和 返回类型 的方法的引用。 委托 可认为是函数式语言里的“函数类型”,通过委托,可以将方法视为可赋值给变量或作为参数传递的实体。 委托还类似于其它一些语言中存在的“函数指针”概念。 具有相同参数列表和返回类型…

    C#语言教程 2021年3月10日
    02710
  • 3.7C#引用类型之数组(Array)

    数组(Array)是一种数据结构,可以用一个统一的数组名和不同的下标(或称索引,index)来确定数组中唯一的元素。根据数组的维度,可以将其分为一维数组、多维数组和交错数组。 数组中的元素是有序的,包含 Length 个元素的数组从 0 索引到 Length-1。 数组中的元素必须属于同一个类型,而且可以随时替换元素。…

    C#语言教程 2021年3月7日
    02730

发表评论

登录后才能评论