c#之特性

什么是特性

        用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。

        用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。

        .Net 框架提供了两种类型的特性:预定义特性和自定义特性。

语法

        名称和值是在方括号内规定的,放置在它所应用的元素(方法)之前。

        positional_parameters 规定必需的信息,name_parameter 规定可选的信息。

[attribute(positional_parameters, name_parameter = value, ...)]

特性与注释区别

[Obsolete]编译时就有提示,影响了编译器[Obsolete(“请不要使用这个了,请使用什么来代替”, true)]甚至导致编译报错

        Obsolete 是一个特性类,标记已过时的代码或方法,当(类,方法、属性等)标记时,意味不在推荐使用。
[Serializable]对象就可以序列化,影响了程序运行

        Serializable是一个特性类,表示该类的对象可以被序列化,序列化是将对象转换为字节流的过程。

    /// <summary>
    /// 这里是注释,除了让人看懂这里写的是什么,对运行没有任何影响
    /// </summary>
    ///[Obsolete("请不要使用这个了,请使用什么来代替")]//对编译都产生了影响,编译出现警告
    ///[Obsolete("请不要使用这个了,请使用什么来代替", true)]//对编译都产生了影响,编译报错不通过
    [Serializable]//可以序列化和反序列化

特性使用

        1.预定义特性

  • AttributeUsage  描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型
//使用这个特性时,可以应用于类、结构体、枚举和委托。  Inherited 是false表示不允许此类被继承
        [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Delegate, Inherited = false)]
        //可以被com可见  而com(Component Object Model)是软件组件的架构,用于实现跨平台和多语言的软件组件操作
        [ComVisible(true)]
        public sealed class SerializableAttribute : Attribute
        {
            //用于获取与指定的类型关联的自定义特性
            internal static Attribute GetCustomAttribute(RuntimeType type)
            {
                if ((type.Attributes & TypeAttributes.Serializable) != TypeAttributes.Serializable)
                {
                    return null;
                }

                return new SerializableAttribute();
            }
            //它用于判断指定的类型是否标记为可序列化
            internal static bool IsDefined(RuntimeType type)
            {
                return type.IsSerializable;
            }
        }
  • Conditional  标记了一个条件方法,其执行依赖于指定的预处理标识符 
    允许我们包括或排斥特定方法的所有调用。简单的讲它可以根据条件编译来进行方法调用。)
         public class MyClass
            {
                //Conditional用于指定在方法调用时的条件
                [Conditional("MyClass")]
                public void MethodA(string msg)
                {
                    Console.WriteLine(msg);
                }
    
                public void MethodB()
                {
                    Console.WriteLine("进行中");
                }
    
            }
  • Obsolete 标记了不应被使用的程序实体
[Obsolete("请不要使用这个了,请使用什么来代替")]//对编译都产生了影响,编译出现警告
[Obsolete("请不要使用这个了,请使用什么来代替", true)]//对编译都产生了影响,编译报错不通过

          2.自定义特性

  • 定义一个类并且这个类派生自
  • 类的名字以Attribute后缀结构
  • 为了安全性,可以用一个sealed修饰成一个密封类型(非必须的),以防止被其他类所继承
     


 

public sealed class MyCustomAttribute : Attribute
    {
        public MyCustomAttribute() 
        { 
        
        }

        public MyCustomAttribute(string name)
        { 
        
        }
    }

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值