zoukankan      html  css  js  c++  java
  • C#特性

    1、概念

      特性(Attribute)是用于在运行时传递程序中各种元素(比如类、方法、结构、枚举、组件等)的行为信息的声明性标签。您可以通过使用特性向程序添加声明性信息。一个声明性标签是通过放置在它所应用的元素前面的方括号([ ])来描述的。

    特性(Attribute)用于添加元数据,如编译器指令和注释、描述、方法、类等其他信息。.Net 框架提供了两种类型的特性:预定义特性和自定义特性。

    2、Net 框架提供了三种预定义特性

    • AttributeUsage
    • Conditional
    • Obsolete

    AttributeUsage

      预定义特性 AttributeUsage 描述了如何使用一个自定义特性类。它规定了特性可应用到的项目的类型。

    规定该特性的语法如下:

    1 [AttributeUsage(
    2    validon,
    3    AllowMultiple=allowmultiple,
    4    Inherited=inherited
    5 )]

    其中:

    • 参数 validon 规定特性可被放置的语言元素。它是枚举器 AttributeTargets 的值的组合。默认值是 AttributeTargets.All
    • 参数 allowmultiple(可选的)为该特性的 AllowMultiple 属性(property)提供一个布尔值。如果为 true,则该特性是多用的。默认值是 false(单用的)。
    • 参数 inherited(可选的)为该特性的 Inherited 属性(property)提供一个布尔值。如果为 true,则该特性可被派生类继承。默认值是 false(不被继承)。

    Conditional

    这个预定义特性标记了一个条件方法,其执行依赖于指定的预处理标识符。

    它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值。效果与“#if DEBUG”相似。

    Conditional使用示例如下:

    #define TEST
    using System;
    using System.Diagnostics;
    
    namespace Test
    {
        
        class Program
        {
            static void Main(string[] args)
            {
                Myclass.Message("测试代码!");
                Console.ReadKey();
            }
        }
        public class Myclass
        {
            [Conditional("TEST")]
            public static void Message(string msg)
            {
                Console.WriteLine(msg);
            }
        }
    }

    运行结果为:

     若头部未定义“#define TEST”则不会有输出结果。

    #if DEBUG”实现代码如下:

    #define TEST
    using System;
    using System.Diagnostics;
    
    namespace Test
    {
        
        class Program
        {
            static void Main(string[] args)
            {
    #if TEST
                Myclass.Message("测试代码!");
    #endif
                Console.ReadKey();
            }
        }
        public class Myclass
        {
            //[Conditional("TEST")]
            public static void Message(string msg)
            {
                Console.WriteLine(msg);
            }
        }
    }

    运行效果与Conditional一致。

    Obsolete

      这个预定义特性标记了不应被使用的程序实体。它可以让您通知编译器丢弃某个特定的目标元素。例如,当一个新方法被用在一个类中,但是您仍然想要保持类中的旧方法,您可以通过显示一个应该使用新方法,而不是旧方法的消息,来把它标记为 obsolete(过时的)。

    规定该特性的语法如下:

    [Obsolete(message)]
    [Obsolete(message, iserror)]

    其中:

    • 参数 message,是一个字符串,描述项目为什么过时以及该替代使用什么。
    • 参数 iserror,是一个布尔值。如果该值为 true,编译器应把该项目的使用当作一个错误。默认值是 false(编译器生成一个警告)。

    示例:

    using System;
    class Program
    {
        static void Main()
        {
            MethodA();
        }
    
        [Obsolete("Use MethodB instead")]
        static void MethodA()
        {
    
        }
    }

    该程序在编译时会产生警告消息:警告 1 “Program.MethodA()”已过时:“Use MethodB instead” 。

    对于C#中的其它构造器,用同样的方法来使用Attributes。Obsolete attribute可以不含参数;可以含一个参数,用以产生一个编译警告信息;也可以含两个参数,第一个参数用以产生编译警告/错误时的提示信息,第二个参数用以指定处理方式(true:产生编译错误;false:产生编译警告)。

    对于有不同版本的程序代码,obsolete attribute显得大有用武之地。如果开发了一个新的方法,并且可以确定不再希望使用某方法,那么就可以使用Obsolete attribute来修饰该方法,编译代码后,按警告/错误提示信息逐一更正原来的代码。在一个大型工程中,有助于协调不同的程序员所采用的方法。

    若以上内容对您有帮助,请给博主点个赞吧(●'◡'●)

  • 相关阅读:
    HDU
    hdu-1260 tickets
    hdu-1024 Max Sum Plus Plus
    spfa+链式前向星模板
    kafka-伪集群搭建
    elasticsearch-安装-centos7- es7.5 搭建
    elk-安装 通过docker
    kibana-安装-通过docker
    logstash -grok插件语法介绍
    docker 启动redis/nginx
  • 原文地址:https://www.cnblogs.com/LoveHui0529/p/13080082.html
Copyright © 2011-2022 走看看