可选参数、命名参数、.NET的特殊类型、特性

1、可选参数和命名参数
    1.1可选参数
        语法:
            [修饰符] 返回类型 方法名(必选参数n,可选参数n)
        注意:
            1.必选参数可以不存在,也可以有多个;可选参数可以有1个或多个
            2.可选参数必须放在必选参数之后
            3.可选参数在定义时需要赋初始值
            4.可选参数之间也需要使用,进行分隔
            5.调用可选参数时,不能跨参数赋值
    1.2命名参数
        语法:
            方法名(参数1名:参数1值,...)
        优势:
            1.可以指定参数的名字来进行参数赋值
            2.可以跨参数赋值
2、.NET的特殊类型
    2.1隐式类型
        关键字var:使用var声明的变量称为隐式类型变量
        注意:
            1.使用var,必须在声明变量时同时赋值
            2.隐式类型在声明赋值之后就不能够再给它赋予一个其他类型的值
    2.2匿名类型
        语法:var stu=new {Name="张三",Age=18,Gender="男"};
        匿名类型的创建:通过new运算符和对象初始值来创建匿名类型,不需要定义属性的类型,属性类型由属性值推断出来
        匿名类型的两种用法:
            1.使用var定义匿名类型变量
            2.直接作为方法的参数值进行传递,典型的用途就是routes.MapRoute()方法的defalut参数
        通过对象使用数据:
            var stu=new {object.Name,object.Age};    默认将所使用对象的属性名作为其属性名
        注意:
            匿名类型中属性的赋值是一次性的,即匿名对象的属性是只读的
    2.3dynamic类型
        动态类型对象:
            dynamic personl=new Student{Name="张三",Age=20};
            personl.Introduce();
        注意:
            1.调用动态类型的成员时,并不做编译时检查,而是在运行时检查;所以调用时没有快捷提示
        dynamic类型是弱类型,可以直接赋任意类型的值
        dynamic与var关键字的区别:
            var:
                1.只能用于局部变量,不能用于字段、参数
                2.声明的同时必须初始化
                3.变量的类型在编译时就确定了
            dynamic:
                1.可用于类型的字段、方法参数、方法返回值,可用于泛型类型参数等
                2.可以赋值或被赋值任何类型,并不需要强制类型转换
        dynamic有哪些应用场合?
            dynamic动态类型的用法主要有:
                1.多语言混合编程,如IronRuby和IronPython
                2.简化反射的操作
                3.简化COM互操作
                4.处理HTML DOM对象
    2.4可空类型
        语法:
            System.Nullable<类型> 变量名
            类型?变量名
            (类型指的是值类型)
        作用:
            1.可用类型允许变量包含未定义的值,多用于与数据库的交互中
            2.可空类型就是为了解决非空类型默认值的问题
        注意:
            当把一个可空类型赋给一个非空类型时,将引发编译错误
        以下属性可配合可空类型解决问题:
            1.DBnull.Value:表示数据库的null值
                案例:int? Age    user.Age=reader["Age"]!=DBnull.Value?(int?)reader["Age"]:null;
            2.HasValue:属于bool类型,当变量包含非空值时,它被设置为true
            3.Value:类型与其对应的值类型相同,如何HasValue为true,则说明Value包含有意义的值。如果HasValue为false,则访问Value将引发InvalidOperaionException异常
        使用"??"运算符分配默认值:
            int? num=null;
            int num2=num??0;
            "??"运算符会首先判断左操作数是否为null,如果为null则返回"??"右面给出的默认值,否则返回左操作数
3、特性
    语法:[特性名] 或[特姓名(参数值...)]
    C#中的特性主要的特点:
        1.为目标元素(可以是程序集、类、属性、方法等)加入附加信息,类似于注释
        2.特性本质上也是一个类,直接或间接地继承自Attribute类
    注意:
        1.特性命名都以Attribute结尾,使用时可以省略,.NET会自动找到对应的特性类
        2.同一目标元素可以使用多个
        3.特性名必须放在[]之间,()之间的参数由特性类的构造函数确定
    1.特性用于方法
        ObsoleteAttribute:它用于标记一个不再使用的程序元素
            [Obsolete("不要使用旧的方法,请使用新的方法",false)]
                第1个参数是string类型的文字说明,解释。
                第2个参数是告诉编译器是否把使用这个方法视为一种错误,如果值为true,编译时会提示错误;如果为false,程序不会报错,但编译器会产生一个警告
        Obsolete特性就是ObsoleteAttribute类,继承自 Attribute类,它包含构造函数,也包含属性成员,根据Obsolete特性的定义,在使用它时可以有多种语法形式:
            [Obsolete]和[Obsolete("不要使用旧的方法,请使用新的方法",false)]
            [Obsolete]和[Obsolete()]是等价的
    2.特性应用到类上:
        [Serializable]:表示支持序列化
            序列化,主要是将对象的状态信息转换为可以存储或传输的形式
    3.特性应用到程序集上
        在所有.NET项目中都包含应用到程序集上的特性,它们出现在所有的项目中的"Properties\AssemblyInfo.cs"文件夹中
            AssemblyTitle:表示程序集的标题
            AssemblyDescription:用来描述程序集信息
            AssemblyCompany:用来定义公司
            AssemblyProduct:用来定义产品
            AssemblyCopyright:用来声明版本
            GuidL:用来定义程序集唯一的编号
            AssemblyVersion:定义程序集的版本
        是不是一个目标元素(类、属性)只能有一个特性?
            不一定,C#中的目标元素可以有多个特性
       

posted @ 2017-06-22 23:30  心之烙印  阅读(1046)  评论(0编辑  收藏  举报