zoukankan      html  css  js  c++  java
  • C#学习笔记2

    1. 可空类型(Nullable)

    ?:单问号用于对int,double,bool 等无法直接赋值为null的数据类型进行null赋值,意思是这个数据类型是NullAble类型的。

    int? i = 3 
    等同于
    Nullable<int> i = new Nullable<int>(3);
    
    int i; //默认值0
    int? ii; //默认值null

    ??:双问号可用于判断一个变量在为null时返回一个指定的值。

    用处:在处理数据库和其他可能未赋值的元素的数据类型时,将null赋值给数值类型或布尔类型的功能特别有用。

    声明一个 nullable 类型(可空类型)的语法如下:

    < data_type> ? <variable_name> = null;

    例子:

    using System;
    
    namespace CalculatorApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                int? num1 = null;
                int? num2 = 45;
                double? num3 = new double?();
                double? num4 = 3.1415926;
                bool? boolval = new bool();
                //显示
                Console.WriteLine("显示可空类型的值:{0},{1},{2},{3}", num1, num2, num3, num4);
                Console.WriteLine("一个可空的布尔值:{0}", boolval);
                Console.ReadLine();
            }
        }
    }

    结果

    显示可空类型的值: , 45,  , 3.14157
    一个可空的布尔值:

    Null合并运算符(??)

    Null 合并运算符定义可空类型和引用类型的默认值。并且可以执行隐式类型转换,如double?转换为double

    例子:

    using System;
    
    namespace CalculatorApplication
    {
        class Program
        {
            static void Main(string[] args)
            {
                double? num1 = null;
                double? num2 = 3.1415926;
                double num3;
                num3 = num1 ?? 5.34; //num1如果为空值则返回5.34
                Console.WriteLine("num3 的值:{0}", num3);
                num3 = num2 ?? 5.44;
                Console.WriteLine("num3 的值:{0}", num3);
                Console.ReadLine();
            }
        }
    }

    结果:

    num3 的值: 5.34
    num3 的值: 3.14157

    2. C#预处理命令

    预处理指令指导编译器在实际编译开始之前对信息进行预处理。

    #define预处理器指令创建符号常量。该命令只能在所有代码最前面。

    语法如下:

    #define symbol

    例子:

    #define PI
    using System;
    
    namespace PreprocessorDAppl
    {
        class Program
        {
            static void Main(string[] args)
            {
                #if(PI)
                Console.WriteLine("PI is define");
                #else
                Console.WriteLine("PI is not define"); //在编译器里这里会变成灰色,不会被编译,即使有语法错误项目也能编译成功
                #endif
                Console.ReadKey();
            }
        }
    }

    条件指令

    可以使用#if指令来创建一个条件指令。条件指令用于测试符号是否为真。如果为真,编译器会执行 #if 和下一个指令之间的代码。

    语法如下:

    #if symbol [operator symbol]...

    其中,symbol 是要测试的符号名称。您也可以使用 true 和 false,或在符号前放置否定运算符。

    常见运算符有:

    • ==(等于)
    • !=(不等于)
    • & (与)
    • || (或)

    一个以 #if 指令开始的条件指令,必须显示地以一个 #endif 指令终止。

    注意#elif为正确写法,没有#else if

    #define DEBUG
    #define VC_V10
    using System;
    
    namespace TestClass
    {
        class Program
        {
            static void Main(string[] args)
            {
                #if (DEBUG && !VC_V10)
                    werhtsds
                #elif (!DEBUG && VC_V10)
                    adshahrha
                #elif (DEBUG && VC_V10)
                    Console.WriteLine("DEBUG and VC_V10 are defined");
                #else
                     Console.WriteLine("DEBUG and VC_V10 are not defined");
                #endif
                Console.ReadKey();
            }
        }
    }

    上面代码会运行成功,结果如下

    DEBUG and VC_V10 are defined

    预处理器指令的用途理解:

    在程序调试和运行上有重要的作用。比如预处理器指令可以禁止编译器编译代码的某一部分,如果计划发布两个版本的代码,即基本版本和有更多功能的企业版本,就可以使用这些预处理器指令来控制。在编译软件的基本版本时,使用预处理器指令还可以禁止编译器编译于额外功能相关的代码。另外,在编写提供调试信息的代码时,也可以使用预处理器指令进行控制。总的来说和普通的控制语句(if等)功能类似,方便在于预处理器指令包含的未执行部分是不需要编译的。

    3. C#特性

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

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

    规定特性

    语法:

    [attribute(positional_parameters, name_parameter = value, ...)]
    element

    特性的名称和值事再方括号内规定的,放置在它所应用的元素之前。positional_parameters规定必须的信息,name_parameter贵姓可选的信息。

    预定义特性

    .Net框架提供了三种预定义特性:

    • AttributeUsage
    • Condotional
    • Obsolete

    AttributeUsage描述了如何使用一个自定义特性类。他古icing了特性可应用到的项目和类型。

    该特性的语法如下:

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

    例如:

    [AttributeUsage(AttributeTargets.Class |
    AttributeTargets.Constructor |
    AttributeTargets.Field |
    AttributeTargets.Method |
    AttributeTargets.Property, 
    AllowMultiple = true)]

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

    它会引起方法调用的条件编译,取决于指定的值,比如 Debug 或 Trace。例如,当调试代码时显示变量的值。

    语法如下:

    [Conditional(
       conditionalSymbol
    )]

    例如:

    [Conditional("DEBUG")]
  • 相关阅读:
    D. Babaei and Birthday Cake--- Codeforces Round #343 (Div. 2)
    Vijos P1389婚礼上的小杉
    AIM Tech Round (Div. 2) C. Graph and String
    HDU 5627Clarke and MST
    bzoj 3332 旧试题
    codeforces 842C Ilya And The Tree
    codesforces 671D Roads in Yusland
    Travelling
    codeforces 606C Sorting Railway Cars
    codeforces 651C Watchmen
  • 原文地址:https://www.cnblogs.com/wintertone/p/10640036.html
Copyright © 2011-2022 走看看