【C#学习笔记】【Attribute】

C#学习笔记系列

第一章 【C#学习笔记】【StackTrace】
第二章 【C#学习笔记】【Attribute】



前言

学习特性的使用,包括对.Net自带的三种预定义特性:Obsolete、Conditional、AttributeUsag的详细讲解,也列举了常用的特性,其中包括控件设计时要用到的一系列特性,最后介绍了如何进行自定义特性(仅以枚举作为示例)。


一、Attribute介绍

Attribute(特性)
MSDN给出定义:
Attribute类将预定义的系统信息或用户定义的自定义信息与目标元素相关联。
目标元素可以是程序集、类、构造函数、委托、枚举、事件、字段、接口、方法、可移植可执行文件模块、参数、属性(Property)、返回值、结构或其他特性(Attribute)。

二、Obsolete

Obsolete是.Net自带的三种预定义特性之一,该特性可以用来声明程序体是过时的,一个程序在不断迭代更新的过程中,总会出现要用新方法代替老方法的情况,但又不能删除老方法因为旧的项目在用,这是我们使用这个特性就能起到提示作用,Obsolete特性将程序结构标注为被弃用的。
在这里插入图片描述Obsolete有三个重载

public sealed class ObsoleteAttribute : Attribute
{
   
   
    //表示该程序体是被弃用的
    public ObsoleteAttribute();
    //string参数可以输入提示内容,在鼠标移动到程序体名称上显示,默认为“已过时”
    public ObsoleteAttribute(string? message);
    //bool参数用来表示该弃用方法是否编译报警,若为true,被使用时,会产生编译器错误,无法编译成功;若为false,则只是编译警告,告知方法是弃用的,但仍可编译成功并运行
    public ObsoleteAttribute(string? message, bool error);
}

三、Conditional

Conditional是.Net自带的三种预定义特性之一,位于System.Diagnostics命名空间下,这个特定通过条件判断决定是否运行下面对应的程序体
在这里插入图片描述

可以看到,定义了“Debug”字符串,方法Test1会运行,未定义“Release”字符串,Test2不会被运行。

四、AttributeUsage

AttributeUsag是.Net自带的三种预定义特性之一,仅对继承自Attribute的派生类有效,目的是控制当前类的使用范围。
如下面代码,定义了一个AttributeUsage的自定义特性,在AttributeUsage参数中传入了AttributeTargets.Method,指定当前特性仅对方法有效。

[AttributeUsage(AttributeTargets.Method)]
public sealed class FlowDemoAttribute : Attribute
{
   
   
    public FlowDemoAttribute() {
   
    }

    public string? Name {
   
    get; set; }

    public string? GetDisplayName()
    {
   
   
        return Name;
    }
}

那么在使用这个特性的时候,就只能定义在方法的上面,若放到其他的机构如字段,就会报错,如下图所示
在这里插入图片描述在这里插入图片描述如果需要指定对多个程序体有效的话,这里写多个目标,中间用 | 隔开,或者指定AttributeUsage.All,表示对所有程序体有效

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter, AllowMultiple = false)]

AttributeUsage有两个重载

public sealed class AttributeUsageAttribute: Attribute
{
   
   
    //AttributeTargets参数规定特性可被放置的语言元素。它是枚举器 AttributeTargets 的值的组合,默认为“AttributeUsage.All”
    public AttributeUsageAttribute(AttributeTargets validOn);
    //allowMultiple参数,如果为 true,则该特性是多用的。默认值是 false(单用的)
    //inherited参数,如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)
    public AttributeUsageAttribute(AttributeTargets validOn, bool allowMultiple, 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值