類和結構

來源:互聯網
上載者:User

標籤: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首碼時,傳遞給該方法的變
量可以不初始化。該變數通過引用傳遞,所以在從被調用的方法中返回時,對應方法對該變數進行
的任何改變都會保留下來。

類和結構

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.