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

    以下是学习笔记:

    泛型:把类型做到通用,最终目的是可以动态编程

    反射:读取DLL文件描述信息的一个类库

    特性:贴标签,贴上标签后就产生了新的功能

    一,认识特性

    特性:1,是一个类。2,继承自Attribute。满足这2个就是特性。

    目前哪些地方是使用到了特性:几乎所有的框架都用到了,MVC,WebApi, EF,IOC,AOP

    特性使用场景:数据验证,授权

    1,数据验证:

    举例1:

     说明:

    [Required]:这个属性不能为空,不输入值就报错

    [Disaply(Name=“电子邮件”)]:这个属性自动显示名字:“电子邮件”

    举例2:

    说明:

     [EmailAddress]:验证电子邮件地址

    举例3:

     说明:

    还能指定数据类型

    2,授权

    说明: 

    这是一个授权的,标注了这个属性【Authorize】,下面的这个方法才能用。

    二,特性分类

    1,系统自带特性

    [DebuggerStepThrough]:不让调试

    [Obsolete]:已过时的

    有一些是影响到了编译器的运行

    2,自定义的

    举例:系统自带的特性

            #region 系统自带的特性
            
            [Obsolete("这个方法过时了,使用NewMedthod代替",false)]//Obsolete用来表示一个方法被弃用了,参数1是字符串提示的,参数2,true或false(true是错误,false是警告)
            //如果参数2是true ,运行 OldMedthod()就报错啦
            static void OldMedthod()
            {
                Console.WriteLine("旧方法");
            }
            static void NewMedthod()
            {
                Console.WriteLine("新方法");
            }
    
            [Conditional("IsTest")]//Conditional特性,这个方法不会被调用了。#define IsTest//定义了一个宏,在using前面加这一行,就可以继续使用
            static void Test1()
            {
                Console.WriteLine("test1");
            }
            static void Test2()
            {
                Console.WriteLine("test2");
            }
    
            [DebuggerStepThrough]//可以掉过debugger的单步调试,不让进入该方法(当我们确定这个方法没有任何错误的时候可以使用这个特性)
            static void PrintOut(string str,[CallerFilePath]string fileName="",[CallerLineNumber]int lineNumber=0,[CallerMemberName]string methodName="")
            {
                Console.WriteLine(str);
                Console.WriteLine(fileName);//文件路径
                Console.WriteLine(lineNumber);//代码行数
                Console.WriteLine(methodName);//调用成员的名称
            }
    
            #endregion
    

      

    三,创建特性

    要把DefidAttribute看出是一个普通的类,里面可以写字段,方法,属性,,,

    四,特性调用

    1,创建特性:

    //自定义Attribute
        [AttributeUsage(AttributeTargets.Class,AllowMultiple=false,Inherited=false)]
        //参数1:可以被哪些情况下使用,如果是All就是被所有情况下都可以用。
        //参数2:是否可以放多次
        //参数3:是否被继承
       
        public class HelpAttribute:Attribute
        {
            protected string description;
            public HelpAttribute(string description_in)
            {
                this.description = description_in;
            }
    
            public string Description
            {
                get { return this.description; }
            }
        }
    
        //调用自定义的Attribute
        //[Help("this is a do-nothing class")]//调用特性方法1:
        [HelpAttribute("this is a do-nothing class")]//调用特性方法2:写上全称也可以
        public class AnyClass
        {
    
        }
    

      

    2,特性调用:

                #region 通过反射来获取Attribute中的信息
                Console.WriteLine("------------通过反射来获取Attribute中的信息-------------");
                HelpAttribute helpAttribute;
                foreach (var item in typeof(AnyClass).GetCustomAttributes(true))
                {
                    helpAttribute = item as HelpAttribute;
                    if (helpAttribute != null)
                    {
                        Console.WriteLine("AnyClas Description:{0}", helpAttribute.Description);
                    }
                }
                #endregion
    

      

    结果:AnyClas Description:this is a do-nothing class

  • 相关阅读:
    webstorm 格式化代码及常用快捷键
    Jetbrains 2018 等系列软件激活破解除去黄色警告框方法(含多个平台)
    HTML5 Shiv完美解决IE(IE6/IE7/IE8)不兼容HTML5标签的方法
    为什么macos开机黑屏但是有声音?
    mac 回车键、空格键失灵(非物理原因)解决方法
    在VS代码中使用版本控制
    在Visual Studio代码中使用Flask
    [IOI1999]花店橱窗布置(DP路径记录)
    leetcode:Minimum Path Sum(路线上元素和的最小值)【面试算法题】
    c/c++ 复习基础要点01-const指针、指针函数 函数指针、new/delete与malloc/free区别与联系
  • 原文地址:https://www.cnblogs.com/baozi789654/p/14227336.html
Copyright © 2011-2022 走看看