1.值類型和引用類型
對於C#的變量來說,有兩種類型,值類型(Value Type)和引用類型(Reverence Type)。兩者不同點:
值類型繼承自ValueType
如下圖:
兩者存儲方式不同:
值類型變量存儲在棧當中。引用類型內存數據結構表示分有兩部分構成,一部分引用,存儲在在棧中, 一部為實際變量成員,存儲在在堆中。
如圖:
注意:以上情況是指值類型和引用類型不是作為引用類型的成員,如果作為引用類型變量成員,值類型的數據和引用類型的引用都存儲在棧中。
2.方法的參數修飾符 ref ,out ,params:
默認情況下,對於值類型參數的傳遞,其形參(Formal parameter)是實參(Formal parameter)的拷貝。在方法中對於形參所作的任何更改不會影響到實參。 對於引用類型的參數的傳遞,其形參(Formal parameter)是實參(Formal parameter)的部分拷貝(shallow clone),通常也叫淺拷貝。 形參只拷貝了的引用部分(即:在棧中存儲的部分),這個引用同樣指向實參的在堆(Heap)中的對象數據。 在這種情況下,方法內部對於形參的引用指向的成員數據改變將反映到實參,而對於形參的引用本身的更改不會影響到實參。
例:
class MyClass
{
public int Val = 20;
}
class Program
{
static void MyMethod(MyClass f1, int f2)
{
f1.Val = f1.Val + 5;
f2 = f2 + 5;
f1 = new MyClass();
}
static void Main()
{
MyClass A1 = new MyClass();
int A2 = 10;
MyMethod(A1, A2); // Call the method.
}
}
對於Ref參數修飾符號,對於值類型參數的傳遞,其形參(Formal parameter)和實參(Formal parameter)是棧中同一個數據塊。在方法中對於形參所作的更改在控制回調時會反映到實參。對於引用類型的參數的傳遞,其形參(Formal parameter)是實參(Formal parameter)是指同一個變量(棧中Reverence引用部分和堆中object數據部分),在方法中對於形參所作的更改在控制回調時當然會反映到實參 。例:
class MyClass
{ public int Val = 20; } // Initialize field to 20.
class Program
{
static void MyMethod(ref MyClass f1, ref int f2)
{
f1.Val = f1.Val + 5; // Add 5 to field of f1 param.
f2 = f2 + 5; // Add 5 to second param.
}
static void Main()
{
MyClass A1 = new MyClass();
int A2 = 10;
MyMethod(ref A1, ref A2); // Call the method.
}
}
Out參數修飾符Ref功能類似,如果兩個方法簽名僅僅在ref或者out方面使用不同,都會引起重載(overload),
例如:
class MyClass
{
public void MyMethod(int i){ i = 10;}
public void MyMethod(ref int i){ i = 10;}
}
但是在OUT和ref之間無法定義重栽。如以下例子是無效的重載(但是編譯可以通過):
class MyClass
{
public void MyMethod(out int i){ i = 10;}
public void MyMethod(ref int i){ i = 10;}
}
區別如下:
Out在控制回調前,必須在方法體內進行形參賦值。
Ref在方法調用前,必須對實參進行顯式的賦值。
params 關鍵字指定在參數數目可變,具體經典用法例子在微軟PetShop的數據訪問層的SQLHelper中可見。
3.類,對象,引用
類(class)是在內存中看得到摸得著的類型實例的一個藍圖,是對象的特性的抽象和行為的概括。通常,類在擴展文件名為.CS的代碼文件中被定義。
通常一旦類被定義,你可以用使用New關鍵字生成任何對象(object),對象是類的一個實例(instance)。
但是,new關鍵字返回堆(heap)的引用(references),並不是這個實際的對象(object)本身,而你在應用程序當中使用的這個引用(references)變量是存在於棧(Stack),如果調用用這個對象的(Object)的屬性和方法,使用.(Dot)操作符號。對於引用(references)的定義和解釋,你可以借助圖來理解。