zoukankan      html  css  js  c++  java
  • C#速成之四(Quick C#)

    C#的装箱思想是全新的。上面提到过所有的数据类型,不论内置或用户自定义,全都从命名空间System的一个基类object派生出来。因此把基本的或者原始类型转换成object类型被称做装箱,反之,这种方式的逆操作被称为拆箱。

    示例:

    class Test

    {

       static void Main()

       {

          int myInt = 12;

          object obj = myInt ;       // 装箱

          int myInt2 = (int) obj;    // 拆箱

       }

    }

    示例展示了装箱和拆箱操作。一个整型值转换成object类型,然后又转换回整型。当一个值类型的变量需要转换成引用类型时,一个object的箱子会被分配容纳这个值的空间,这个值会被复制进这个箱子。拆箱与此相反,一个object箱子中的数据被转换成它的原始值类型时,这个值将被从箱中复制到适当的存储位置。

    -------------------

    方法参数

    -------------------

    C#中有三种类型的参数:

    值参数/输入型参数

    引用型参数/输入输出型参数

    Out参数

    如果你有COM接口和它的参数类型的概念,你会很容易理解C#参数类型。

    值参数/输入型参数

    值概念与C++相同。所要传递的值会被复制到一个位置上并被传递给函数。

    示例:

    SetDay(5);

    ...

    void SetDay(int day)

    {

        ....

    }

    引用型参数/输入输出参数

    C#中的引用参数既不是C++中的指针也不是引用操作符(&)来传递的。C#的引用型参数减少了出错的可能。引用型参数也被称作输入输出参数,因为你传递了一个引用地址,因此你可以从函数中传递一个输入值并且可以获得一个输出值。

    你不能把一个未经初始化的引用型参数传递给函数。C#ref这个关键字来声明引用型参数。当你传递一个变量给函数要求的引用参数时必须使用一个ref关键字说明。

    示例:

        int a= 5;

        FunctionA(ref a);        // 要用ref声明变量,否则你会得到

                                // 一个编译错误

        Console.WriteLine(a);    // 指向地址的值为20

        void FunctionA(ref int Val)

        {

            int x= Val;

            Val = x* 4;

        }

    Out参数

    Out型参数仅仅从函数当中返回一个值。不要求有输入值。C#用关键字out来描声明这个参数

    示例:

        int Val;

        GetNodeValue(Val);

        bool GetNodeValue(out int Val)

        {

            Val = value;

            return true;

        }

    可变数量的参数和数组

    数组在C#当中是通过关键字params来描述传递的。作为数组类型的变量,你能传递任意数量的元素。从下面示例中你可以理解的更好。

    示例:

        void Func(params int[] array)

        {

            Console.WriteLine("number of elements {0}",array.Length);

        }

        Func();                      // prints 0

        Func(5);                     // prints 1

        Func(7,9);                   // prints 2

        Func(new int[] {3,8,10});    // prints 3

        int[] array = new int[8] {1,3,4,5,5,6,7,5};

        Func(array);                 // prints 8

    -------------------

    运算符和表达式

    -------------------

    运算符和表达式概念与C++完全相同。但是一些新的有用的运算符被填加了进来。我将在这里讨论其中的某些部分。

    is 运算符

    is 运算符被用于检查操作数的类型是否相同或者是否可以转换。is 运算符在多态环境下特别有用。它有两个操作数,运算结果是一个布尔型。看这个示例:

    void function(object param)

    {

        if(param is ClassA)

            //do something

        else if(param is MyStruct)

            //do something

        }

    }

    as 运算符

    as 运算符检查操作数的类型是否可被转换或者是否相等(这些 as通过 is 运算符来完成。如果结果是可转换的,则结果将被转换或者被装箱,成object(关于as运算符进行装箱成目标类型的操作请看前面的装箱/拆箱操作)。如果不可转换或者装箱,则返回值是null。瞧一瞧下面的例子我们会更好地理解这个概念。

    Shape shp = new Shape();

    Vehicle veh = shp as Vehicle;   // 结果是null, 类型不可转换

    Circle cir = new Circle();

    Shape shp = cir;

    Circle cir2 = shp as Circle;    //会被转换

    object[] objects = new object[2];

    objects[0] = "Aisha";

    object[1] = new Shape();

    string str;

    for(int i=0; i&< objects.Length; i++)

    {

        str = objects[i] as string;

        if(str == null)

            Console.WriteLine("can not be converted");

        else

            Console.WriteLine("{0}",str);

    }

    输出:

    Aisha

    can not be converted

    -------------------

    语句

    -------------------

    除了对某些新增语句和对某些语句的修改以外,C#语句与C++非常相象。

    下面是新增的语句:

    foreach

    用于循环依次访问集合元素,比如象数组等。

    示例:

        foreach (string s in array)

            Console.WriteLine(s);

    lock

    用于锁住代码块,使线程在临界争区内,别的线程无法进入锁定的临界区。

    checked/unchecked

    用于数值运算中的溢出检测。

    示例:

    int x = Int32.MaxValue; x++;    // 溢出检测

    {

    x++;                            // 异常

    }

    unchecked

    {

    x++;                            // 溢出}

    }

    下面的语句在C#当中已经被修改:

    Switch

    执行一个case语句后,程序流程不允许跳到下一个相邻case语句。这在C++当中是被允许的。

    示例:

    int var = 100;

    switch (var)

    {

        case 100: Console.WriteLine("<Value is 100>");

            // 没有break语句

       case 200: Console.WriteLine("<Value is 200>"); break;

    }

    C++编译后的输出:

        <Value is 100><Value is 200>

    C#下,编译时会报错:

    error CS0163: Control cannot fall through from one case label

    ('case 100:') to another

    但是你仍然能做C++类似的事

    switch (var)

    {

        case 100:

        case 200: Console.WriteLine("100 or 200<VALUE is 200>");

                  break;

    }

    你也可以常数变量作为case 的值:

    示例:

    const string WeekEnd = "Sunday";

    const string WeekDay1 = "Monday";

    ....

    string WeekDay = Console.ReadLine();

    switch (WeekDay )

    {

    case WeekEnd: Console.WriteLine("It's weekend!!"); break;

    case WeekDay1: Console.WriteLine("It's Monday"); break;

    }



    分享到:
  • 相关阅读:
    JVM源码分析之MetaspaceSize和MaxMetaspaceSize的区别
    JSTREE 实现AJAX重载入时刷新所有节点树
    .NET判断是否为AJAX提交
    防止重复提交的思路
    在使用EF时调用DBFUNCTION扩展方法时,发生ENTITYCOMMANDEXECUTIONEXCEPTION 异常的解决办法
    .NET和JAVA中BYTE的区别以及JAVA中“DES/CBC/PKCS5PADDING” 加密解密在.NET中的实现
    .NET中集合已修改;可能无法执行枚举操作 的解决办法
    ASP.NET中将导出的数据以UTF-8编码方式进行存储
    MVC中的BASE.ONACTIONEXECUTING(FILTERCONTEXT) 的作用
    MVC中部分视图调用方法总结
  • 原文地址:https://www.cnblogs.com/qqflying/p/932217.html
Copyright © 2011-2022 走看看