C#速成(之四)

 

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

裝箱和拆箱操作(Boxing/Unboxing

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

 

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;

 

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章