標籤:io os 使用 ar strong 資料 sp c on
類和結構實際上都是建立對象的模板,每個對象都包含資料,並提供了處理和訪問資料的方法。
類定義了類的每個對象(稱為執行個體)可以包含什麼資料和功能。
結構與類的區別是它們在記憶體中的儲存方式、訪問方式(類是儲存在堆heap)上的參考型別,而
結構是儲存在棧(stack上的實值型別)和它們的一些特徵(如結構不支援繼承)。較小的資料類型使用結
構可提高效能。但在文法上,結構與類非常相似,主要的區別是使用關鍵字siuct代替dass來聲明
結構。
類
類中的資料和函數稱為類的成員。Microsoft的正式術語對資料成員和函數成員進行了區分。除
了這些成員外,類還可以包含嵌套的類型(如其他類)。成員的可訪問性可以是public、protected、internal protected、private或internal。
資料成員
資料成員是包含類的資料——欄位、常量和事件的成員。資料成員可以是待用資料。類成員總
是執行個體成員,除非用static進行顯式的聲明。
函數成員
函數成員提供了操作類中資料的某些功能,包括方法、屬性、建構函式和終結器(finalizer)、運
算符以及索引器。
方法是與某個類相關的函數,與資料成員一樣,函數成員預設為執行個體成員,使用盹吮修飾
符可以把方法定義為靜態方法。
屬性是可以從用戶端訪問的函數組,其訪問方式與訪問類的公用欄位類似。唧為讀寫類中
的屬性提供了專用文法,所以不必使用那些名稱中嵌有Get或set的方法。因為屬性的這種
文法不同於一般函數的文法,在用戶端代碼中,虛擬對象被當做實際的東西。
建構函式是在執行個體化對象時自動調用的特殊函數。它們必須與所屬的類同名,且不能有返
回類型。建構函式用於初始化欄位的值。
終結器類似於建構函式,但是在CLR檢測到不再需要某個對象時調用它。它們的名稱與類
相同,但前面有一個“~” 符號。不可能預測什麼時候調用終結器。
運算子執行的最簡單的操作就是加法和減法。在兩個整數相加時,嚴格地說,就是對整數
使用“十”運算子。C#允許指定把已有的運算子應用於自己的類(運算子多載)
索引器允許對象以數組或集合的方式進行索引。
給方法傳遞參數
參數可以通過引用或通過值傳遞給方法。在變數通過引用傳遞給方法時,被調用的方法得到的
就是這個變數,所以在方法內部對變數進行的任何改變在方法退出後仍舊有效。而如果變數通過值
傳送給方法,被調用的方法得到的是變數的一個相同副本,也就是說,在方法退出後,對變數進行
的修改會丟失。對於複雜的資料類型,按引用傳遞的效率更高,因為在按值傳遞時,必須複製大量
的資料。
在c#中,除非特別說明,所有的參數都通過值來傳遞。但是,在理解參考型別的含義時需要注
意。因為參考型別的變數只包含對象的引用,將要複製的正是這個引用,而不是對象本身,所以對
底層對象的修改會保留下來。相反,實值型別的對象包含的是實際資料,所以傳遞給方法的是資料本
身的副本。例如,int通過值傳遞給方法,對應方法對該int的值所做的任何改變都沒有改變原int
對象的值。但如果把數組或其他參考型別伸日類)傳遞給方法,對應的方法就會使用該引用改變這個數組中的值,而新值會反射在原始數組對象上。
using system;
namespace Wrox
{
class ParameterTest
{
static void SomeFunction(int[] ints,int i)
{
ints[0]=100;
i=100;
}
public static int Main()
{
int i=0;
int []ints={0,1,2,3,4,8};
Console.WriteLine("i = "+ i);
Console.WriteLine("ints[0] =" + ints[0]);
Console.WriteLine("Calling SomeFunction");
Console.WriteLine("i = "+ i);
Console.WriteLine("ints[0] =" + ints[0]);
return 0;
}
}
}
結果如下:
i = 0
ints[0]= 0
Calling SomeFunction
i=0;
ints[0]=100
ref參數
如前所述,通過值傳送變數是預設的,也可以道使值參數通過引角傳送給方法。為此,要使用
ref關鍵字。如果把一個參數傳遞給方法,且這個方法的輸入參數前帶有ref關鍵字,則該方法對變
量所做的任何改變都會影響原始對象的值:
static void someFunction〈int[] ints, ref int i)
{
ints[0]=100
i = 100; // The change to i will persist after someFunction() exits.
{
在調用該方法時,還需要添加ref關鍵字:
SomeFunction(ints,ref i);
最後,C#仍要求對傳遞給方法的參數進行初始化,理解這一點也非常重要。在傳遞給方法之前,
無論是按值傳遞,還是按引用傳遞;任何變數都必須初始化。
out參數
在C風格的語言中,函數常常能從一個常式中輸出多個值,這使用輸出參數實現,只要把輸出
的值賦予通過引用傳遞給方法的變數即可。通常,變數通過引用傳遞的初值並不重要,這些值會被
函數重寫,函數甚至從來沒有使用過它們。
如果可以在C#中使用這種約定,就會非常方便。但C#要求變數在被引用前必須用一個初值進
行初始化。儘管在把輸入變數傳遞給函數前,可以用沒有意義的值初始化它們,因為函數將使用真
實、有意義的值初始化它們,但是這樣做是沒有必要的,有時甚至會引起混亂。但有一種方法能夠
簡化C#編譯器所堅持的輸入參數的初始化。
編譯器使用out關鍵字來初始化。在方法的輸入參數前面加上out首碼時,傳遞給該方法的變
量可以不初始化。該變數通過引用傳遞,所以在從被調用的方法中返回時,對應方法對該變數進行
的任何改變都會保留下來。
類和結構