`

Attribute

 
阅读更多

1.特性是用来向程序集中添加额外的元数据信息,比如我们向程序集中的某个类添加了特性,那么在以后用反射读取该程序集的时候,我们就可以看到这些特性描述的信息了,而且在程序运行时你可以通过读取这些信息来影响程序如何运行。

2.特性与备注comment的区别就是备注是不会编译进元数据的,而特性是会编译成程序集的元数据的一部分的。

3.简单的说特性就是程序集中的一种附着物。

4.系统中的一些特性

5.自定义的attribute

           

//======水之真谛=======//
//    
上善若水,润物无声
  //
/*  http://blog.csdn.net/FantasiaX  */

using System;
namespace OysterAttributeSample
{
         class Oyster: System.Attribute                         // 
必需以System.Attribute类为基类

         {
                   // Kind
属性,默认值为
null
                   private string kind;
                   public string Kind
                   {
                            get { return kind; }
                            set { kind = value; }
                   }

                   // Age
属性,默认值为

                   private uint age;
                   public uint Age
                   {
                            get { return age; }
                            set { age = value; }
                   }

                   // 
值为nullstring是危险的,所以必需在构造函数中赋值

                   public Oyster(string arg)                                     // 定位参数
                   {
                            this.Kind = arg;
                   }
         }

         [Oyster("Thorny ", Age=3)]    // 3
年的多刺牡蛎附着在轮船(这是一个类)上。注意:对属性的赋值是在圆括号里完成的!

         class Ship
         {
                   [Oyster("Saddle")]          // 0
年的鞍形牡蛎附着在船舵(这是一个数据成员)上,Age使用的是默认值,构造函数的参数必需完整
                   public string Rudder;
         }

         class 
Program
         {
                   static void Main(string[] args)
                   {
                            // ... 
使用反射来读取Attribute
                   }
         }
}

Attribute作为编译器的指令

在C#中存在着一定数量的编译器指令,如:#define DEBUG, #undefine DEBUG, #if等。这些指令专属于C#,而且在数量上是固定的。而Attribute用作编译器指令则不受数量限制。比如下面的三个Attribute:

  • Conditional:起条件编译的作用,只有满足条件,才允许编译器对它的代码进行编译。一般在程序调试的时候使用。
  • DllImport:用来标记非.NET的函数,表明该方法在一个外部的DLL中定义。
  • Obsolete:这个属性用来标记当前的方法已经被废弃,不再使用了。

下面的代码演示了上述三个属性的使用:

 
#define DEBUG //这里定义条件
    
using System;
using System.Runtime.InteropServices;
using System.Diagnostics;
    
namespace AttributeDemo
{
   class MainProgramClass
   {
 
      [DllImport("User32.dll")]
      public static extern int MessageBox(int hParent, string Message, string Caption, int Type);
     
      static void Main(string[] args)
      {
         DisplayRunningMessage();
         DisplayDebugMessage();
     
         MessageBox(0,"Hello","Message",0);
     
         Console.ReadLine();
      }
     
      [Conditional("DEBUG")]
      private static void DisplayRunningMessage()
      {
         Console.WriteLine("开始运行Main子程序。当前时间是"+DateTime.Now);
      }
  
      [Conditional("DEBUG")]
      [Obsolete]
      private static void DisplayDebugMessage()
      {
         Console.WriteLine("开始Main子程序");
      }
   }
}  

如果在一个程序元素前面声明一个Attribute,那么就表示这个Attribute被施加到该元素上,前面的代码,[DllImport]施加到MessageBox函数上, [Conditional]施加到DisplayRuntimeMessage方法和DisplayDebugMessage方法,[Obsolete]施加到DisplayDebugMessage方法上。

根据上面涉及到的三个Attribute的说明,我们可以猜到程序运行的时候产生的输出:DllImport Attribute表明了MessageBox是User32.DLL中的函数,这样我们就可以像内部方法一样调用这个函数。

重要的一点就是Attribute就是一个类,所以DllImport也是一个类,Attribute类是在编译的时候被实例化的,而不是像通常的类那样在运行时候才实例化。Attribute实例化的时候根据该Attribute类的设计可以带参数,也可以不带参数,比如DllImport就带有"User32.dll"的参数。Conditional对满足参数的定义条件的代码进行编译,如果没有定义DEBUG,那么该方法将不被编译,读者可以把#define DEBUG一行注释掉看看输出的结果(release版本,在Debug版本中Conditional的debug总是成立的)。Obsolete表明了DispalyDebugMessage方法已经过时了,它有一个更好的方法来代替它,当我们的程序调用一个声明了Obsolete的方法时,那么编译器会给出信息,Obsolete还有其他两个重载的版本。大家可以参考msdn中关于的ObsoleteAttribute 类的描述

分享到:
评论

相关推荐

    .net中attribute实现方法调用拦截(就是aop)

    在.NET框架中,Attribute是一种元数据,用于向编译器、IDE、运行时环境等提供额外的信息。这些信息可以用来修饰类、接口、方法、属性等各种编程元素,从而实现特定的功能或扩展。AOP(面向切面编程)是一种编程范式...

    ASP.NET MVC5 新特性:Attribute路由使用详解

    ### ASP.NET MVC5 新特性:Attribute路由使用详解 #### 一、Attribute路由简介与启用 在探讨Attribute路由之前,我们先来明确一下它的定义。**Attribute路由**是一种新的路由机制,它允许开发者直接在控制器的方法...

    BLE通用属性(ATTRIBUTE)组成的最小单元

    BLE的通用属性(Attribute)是构成其通信协议的基础元素,而属性组成的最小单元,即属性(Attribute)的定义和功能,是我们理解和应用BLE技术的关键。 首先,蓝牙通信协议栈中包含两个关键的角色:服务器和客户端。...

    c#的attribute实例源码

    C#的Attribute是一种元数据,它允许我们向代码添加额外的信息,这些信息可以在编译时或运行时被程序集、编译器、反射或其他工具使用。Attribute不是代码的一部分,它们不直接影响程序的执行,但提供了方便的方式来...

    attribute的作用和具体使用方法

    ### Attribute的作用和具体使用方法 随着信息技术的飞速发展,软件开发领域中各种技术与工具不断更新迭代。在Web开发中,属性(Attribute)作为一项基础而重要的功能,被广泛应用于处理用户请求、数据传递以及页面...

    C#特性Attribute的实际应用之:为应用程序提供多个版本

    在.NET框架中,C#的特性(Attribute)是一种元数据,可以附加到代码的各种元素上,如类、方法、属性等,以提供额外的信息。这些信息可以在运行时被反射机制读取,从而实现各种功能。在标题“C#特性Attribute的实际...

    Property和Attribute的区别

    "Property和Attribute的区别" 在面向对象编程(Object-Oriented Programming)中,Property和Attribute都是常用的概念,但是它们之间存在着本质的区别。Property是指类向外提供的数据区域,是智能的字段,其中有get...

    Attribute在NET中的应用

    在.NET框架中,属性(Attribute)是一种元数据,可以附加到程序元素,如类、方法、属性等,为编译器、运行时环境或其他工具提供额外的信息。它们是编程中的一个重要概念,允许开发者向代码中添加非执行性的描述性...

    AttributeError: module 'tensorflow.compat.v1' has no attribute '

    AttributeError: module 'tensorflow.compat.v1' has no attribute 'contrib'的问题您具体怎么解决问题具体解决的seq_loss.py文件

    Attribute标记属性_资料收集

    Attribute标记属性在.NET框架中扮演着重要的角色,它是元数据的一部分,允许我们在代码中附加信息,这些信息在程序运行时可以被编译器、运行时或其他工具读取和使用。Attribute提供了一种灵活的方式来注解类、方法、...

    attributeQuery.rar_AttributeQuery

    "attributeQuery.rar_AttributeQuery" 提供的资源是关于如何利用ArcGIS Engine (AE) 和C#编程语言实现一个特定类型的查询——框选要素并弹出其属性值的查询功能。这个功能对地图数据的分析和应用非常实用,尤其在...

    __attribute__

    ### __attribute__ 在 C 语言中的使用方法 #### 一、引言 在 C 语言中,`__attribute__` 是 GNU 编译器集合 (GCC) 的一个扩展特性,它允许开发人员向函数、变量或类型添加元数据,从而增强编译时的错误检查能力并...

    ZigBee问答之“cluster”、“attribute”

    ### ZigBee中的“Cluster”与“Attribute”详解 #### 一、引言 在深入探讨ZigBee协议中的“Cluster”与“Attribute”之前,我们先来明确这两个概念的基本定义。 - **Cluster**: 按照ZigBee联盟的定义,Cluster是一...

    Attribute在.net编程中的应用

    Attribute在.NET编程中的应用是一个关键的概念,它允许程序员在代码中添加元数据,这些元数据可以为运行时环境提供额外的信息,或者影响程序的行为。在.NET框架中,Attribute不仅仅是一个关键字,而是一个类,它是...

    一个实现IOC的小框架 利用Attribute简化Unity框架IOC注入

    Attribute在.NET中是一种元数据,可以附加到程序元素(如类、方法、属性等)上,提供额外的信息,通常用于运行时反射和自定义行为。 在Unity中,我们通常需要在容器中注册类型映射,然后在需要的地方通过依赖解析...

    c#中的特性(attribute)+反射的一个例子

    在C#编程语言中,特性(Attribute)是一种元数据,它可以提供有关代码的附加信息,这些信息可以在编译时或运行时被程序访问。特性允许程序员向类、方法、属性等添加自定义标记,以便在后期处理中进行特定操作。另一...

    使用C#的Attribute(特性)实现一个简单的ORM

    【内容概要】:在C#中通过学习使用Attribute,实现一个简单的ORM框架。里面主要有两部分的内容,学习使用Attribute获得设定值;学习通过反射获取属性的值 【适应人群】:初级工程师。但需要对反射、Attribute有一定...

    GNU_CC中的attribute

    GNU CC 是一种基于 GCC(GNU Compiler Collection)的C编译器,它提供了许多扩展功能,其中一个重要的特性就是__attribute__机制。__attribute__允许程序员在声明函数、变量或类型时添加额外的元数据,以便让编译器...

    Attribute在.net编程中的应用(全).doc

    ### Attribute在.NET编程中的应用详解 #### 一、Attribute概述 在.NET编程中,Attribute是一个极为重要的特性,它类似于Java中的注解。Attribute主要用于为.NET框架中的类型、字段、方法和属性等添加元数据信息。...

    Multiple Attribute Decision Making Methods and Applications 2011

    5. 多属性效用理论(Multi-Attribute Utility Theory, MAUT):这种方法基于效用函数的概念,考虑决策者对于不同结果的偏好程度,并将其转化为效用值,用以决策。 6. 多准则决策分析(Multi-Criteria Decision ...

Global site tag (gtag.js) - Google Analytics