2013年8月3日

C#教材(6) 函式與參照

函式與參照


  • 類別與基本型別
(1) 資料型別
在通常資料型別(char , int , bool , double..)或是稱數值型別(value type)都是編譯器實際儲存
空間給該變數,例如:當我宣告一個變數的資料型別為int時並指定值42給它,這時編譯器
會規畫32位元的記憶體空間來儲存它。

Ex:
int i = 31 ;         // 指派32位元給它
int temp =  i ;   // 宣告新的記憶體空間來存i的值
i = i+1 ;            // i =32      

由上面可以知道當我們利用基本型別做指派給別的變數、刪除或修改時,並不會影響
其他的變數,因為它是另外宣告一個空間來存放資料內容。

(2) 參照型別
當我們宣告一個類別Car名稱為c後,並將c指派給newC的變數,這時編譯器並不會跟資料
型別一樣存放實際的值,而是存放位址並指向同一個Car物件(資料實際放的位置)。當我
們改變newC的內容也會改變c的內容。我們可以利用一個成語來形容"牽一髮動全身"。

Ex:
class Car{
   public int speed ;
   public string name ;
 }

Car c = new Car()
Car newC = c    //將c實體位址指派給newC

  • null 和 nullable
在C#中不允許初始化宣告為null,但是真的必要宣告為null我們可以利用?來完成。在型別後面加上?號表示該變數為nullable數值型別。
Ex:
      int i = null  (X) 
      int? i = null (O)

當我們將i宣告為nullable時,我們可以利用HasValue來判斷是該值是否為null。

if ( ! i.HasValue )
   i = 99 ;
else
   System.Concole.WriteLine(i.Value);

Nullable屬性 :

HasValue : HasValue 屬於 bool 型別。當變數包含非 null 的值時,該屬性會設定為 true。
Value: 如果 HasValue 為 true,Value 會包含有意義的值。如果 HasValue 為 false,表示該變數為null,存取  Value 將會擲回InvalidOperationException
  • ref參數與out參數
(1) ref 參數
在參數型別前面,加上ref 可以讓參數變成參照型別,表示兩個變數是參考同一個物件。

Ex:
        public static void addOne(ref int param)
        {
            param++;
        }

        public static void Main()
        {
            int arg = 42;
            addOne( ref arg);
            System.Console.WriteLine(arg);
        }

常見的錯誤
        public static void addOne(ref int param)
        {
            param++;
        }

        public static void Main()
        {
            int arg = 42;
            addOne( arg);         //傳遞引數 1 時必須包含 'ref' 關鍵字
            System.Console.WriteLine(arg);
        }

(2) out 參數
   傳遞行為亦屬傳址, 但是不需要去做預先設定指派初始值給它,由函式傳值給它。
 

  • 以 ref 參數傳遞的引數必須先被初始化,out 則不需要。
  • out 參數要在離開目前的方法之前至少有一次指派值的動作。


static void Method(out int i)
{
i = 44;
}

static void Main(string[] args)
{
int value;
Method(out value);
Console.WriteLine("Value:" +value);

}

(3)







































沒有留言:

張貼留言