函式與參照
- 類別與基本型別
(1) 資料型別
在通常資料型別(char , int , bool , double..)或是稱數值型別(value type)都是編譯器實際儲存
空間給該變數,例如:當我宣告一個變數的資料型別為int時並指定值42給它,這時編譯器
會規畫32位元的記憶體空間來儲存它。
空間給該變數,例如:當我宣告一個變數的資料型別為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的內容。我們可以利用一個成語來形容"牽一髮動全身"。
型別一樣存放實際的值,而是存放位址並指向同一個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 (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);
}
{
i = 44;
}
static void Main(string[] args)
{
int value;
Method(out value);
Console.WriteLine("Value:" +value);
}
(3)
留言
張貼留言