大学IT网 - 最懂大学生的IT学习网站! QQ资料交流群:367606806
当前位置:大学IT网 > C#技巧 > .Net内置特性Attribute介绍

.Net内置特性Attribute介绍(1)

关键词:.NetAttribute  阅读(2748) 赞(12)

[摘要]本文是对.Net内置特性Attribute介绍的讲解,对学习C#编程技术有所帮助,与大家分享。

特性Attribute概述

特性(Attribute)是一种特殊的类型,可以加载到程序集或者程序集的类型上,这些类型包括模块、类、接口、结构、构造函数、方法、字段等,加载了特性的类型称之为特性的目标。这里为与属性(Property)区分,所以称之为特性(Attribute)。特性是为程序集添加元数据的一种机制,通过它可以为编译器提供指示或者对数据进行说明。例如前段时间学习的Remoting技术(主要用于应用程序域之间的对象通信)中在应用程序域间的引用对象时该对象具有序列化(Serializable)这个特性。下面使用ObsoleteAttribute特性学习特性的使用方法。

System.ObsoleteAttribute实例

我们有一个旧的方法SendMsg()方法由于功能和效率上的优化重载了这个方法,需要将原来的方法加上Obsolete特性告诉编译器这个方法已经过时,然后编译器发现程序中有地方使用该特性标记过的方法时,就会给出一个如下所示警告信息:

image

测试代码如下所示:

using System;

namespace AttributeTest
{
    /// <summary>
    /// 信息实体类
    /// </summary>
    public class Message
    {
        //此处具体实现略
    }
    /// <summary>
    /// 信息操作类
    /// </summary>
    public class MessageOperation
    {
        [Obsolete("请使用新的SendMsg(Message msg)重载方法")]
        public static void SendMsg()
        {
            Console.WriteLine("这是旧的SendMsg方法");
        }
        public static void SendMsg(Message msg)
        {
            Console.WriteLine("这是新的SendMsg方法");
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            //使用旧的方法SendMsg()
            MessageOperation.SendMsg();
            //使用新的方法SendMsg(Message msg)
            MessageOperation.SendMsg(new Message());
        }
    }
}

这样一来,开发人员编译运行时就看到了"请使用新的SendMsg(Message msg)重载方法"警告,然后就知道应该选用新的SendMsg(Message msg)重载方法。通过上面的例子可以看到特性使用的方法:首先是一对方括号“[]”,在左方括号中后紧跟特性的名称,比如Obsolete。随后是一个圆括号“()”,在这个圆括号中,不光可以传入构造函数的参数,还可以向特性的属性赋值。在Obsolete的例子中,仅传递了构造函数的参数。构造参数又称为位置参数(传入顺序必须与构造函数声明时一致);属性参数也叫做命名参数。

下面通过自定义特性进一步学习特性。

自定义特性

假设我们有这么一个需求:创建或者更新一个类文件是需要说明这个类是什么时候谁创建的,以后是谁更新的等,是不是想下面这样在类上添加注释:

image

这样手动添加是可以记录下来但是需要查看所有类型的更新记录显然就不适合了。带着这么一个悬念,我们先看看Obsolete特性的具体定义如下所示:

using System.Runtime.InteropServices;

namespace System
{
    // 摘要: 
    //     标记不再使用的程序元素。无法继承此类。
    [Serializable]
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct | AttributeTargets.Enum | AttributeTargets.Constructor | AttributeTargets.Method | AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Event | AttributeTargets.Interface | AttributeTargets.Delegate, Inherited = false)]
    [ComVisible(true)]
    public sealed class ObsoleteAttribute : Attribute
    {
        // 摘要: 
        //     使用默认属性初始化 System.ObsoleteAttribute 类的新实例。
        public ObsoleteAttribute();
        //
        // 摘要: 
        //     使用指定的变通方法消息初始化 System.ObsoleteAttribute 类的新实例。
        //
        // 参数: 
        //   message:
        //     描述可选的变通方法的文本字符串。
        public ObsoleteAttribute(string message);
        //
        // 摘要: 
        //     使用变通方法消息和布尔值初始化 System.ObsoleteAttribute 类的新实例,该布尔值指示是否将使用已过时的元素视为错误。
        //
        // 参数: 
        //   message:
        //     描述可选的变通方法的文本字符串。
        //
        //   error:
        //     指示是否将使用已过时的元素视为错误的布尔值。
        public ObsoleteAttribute(string message, bool error);

        // 摘要: 
        //     获取指示编译器是否将使用已过时的程序元素视为错误的布尔值。
        //
        // 返回结果: 
        //     如果将使用已过时的元素视为错误,则为 true;否则为 false。默认为 false。
        public bool IsError { get; }
        //
        // 摘要: 
        //     获取变通方法消息,包括对可选程序元素的说明。
        //
        // 返回结果: 
        //     变通方法文本字符串。
        public string Message { get; }
    }
}
«上一页12下一页»


相关评论