類和結構
類和結構實際上都是創建對象的模板,每個對象都包含數據,并提供了處理和訪問數據的方法,。
結構與類的區別是它們在內存中的存儲方式,訪問方式(類是存儲在堆(heap)上的引用類型),而結構是存儲在棧(stack)上的值類型)和他們的一些特征(如結構不支持繼承)。結構與類非常相似,主要的區別是使用關鍵字struct代替class來聲明結構。
對于類和結構,都使用關鍵字new來聲明實例:這個關鍵字創建對象并對其進行初始化。
類和結構的字段值都默認0:
類中的數據和函數稱為類的成員。
數據成員:數據成員是包含類的數據——字段,常量和事件的成員。數據成員可以是靜態數據。
字段是與類相關的變量。
常量與類的關聯方式同變量與類的關聯方式。const關鍵字聲明常量,假如把它聲明為public,就可以在類的外部訪問他:
函數成員
函數成員提供了操作類中數據的某些功能,包括方法,屬性,構造函數和終結器(finalizer),運算以及索引器。
方法
正式的c#術語分函數和方法。
方法的聲明
表示矩形的.NET基類System.Drawing.Rectangle.
如果方法有返回值時,return語句就必須與返回值一起使用。如果方法沒有返回值時,就把返回類型指定為void,因為不能省略返回類型。
方法可以包含任意多條return語句
調用方法。
MathTest說明了類的定義和實例化,方法的定義和調用的語法,除了包含main()方法的類之外,還定義了Math Test.
從代碼中看出,MathTest類包含一個字段和一個方法,該字段包含一個數字,該方法計算該數字的平方,類還包括兩個靜態方法,一個返回pi的值,另一個計算作為參數傳入的數字的平方。
下面的例子parameterTest.cs說明了如果把數組或其他引用類型(如類)傳遞給方法,對應的方法就會使用該引用改變這個數組中的值,而新值會反射在原始數組對象上:
注意,i的值保持不變,而在ints中改變的值在原始數組中也改變了。
out參數
編譯器使用out關鍵字來初始化,在方法的輸入參數前面加上out前綴時,傳遞給該方法的變量可以不初始化,該變量通過引用傳遞,所以在被用的方法中返回時,對該方法對該變量進行的任何改變都會保留下來,在調用該方法是,還需要out關鍵字,與在定義該方法時一樣:
命名參數,命名參數允許按任意順序傳遞,方法如下:
假如方法有幾個參數,就可以在同一個調用中混合使用位置和命名參數。
可選參數,參數也可以是可選的,可選參數還必須是方法定義的最后一個參數:
要想此方法正常工作,必須在最后定義optionalNumber參數。
方法的重載。為了方法的重載,值需聲明同名單參數個數或參數類型不同的方法即可:
假如不能使用可選參數,就可以使用方法重載來達到此目的:
兩種方法不能僅在返回類型上有區別。兩個方法不能僅根據參數是聲明為ref還是out來區分。
屬性
它是一個方法或一對方法,在客戶代碼看來,它(們)是一個字段。
c#中定義屬性,可以使用下面的語法:
構造函數
聲明基本構造函數的語法就是聲明一個與類同名的方法,但該方法沒有返回類型;
構造函數的重載循環與其他方法相同的規則。
帶參數的構造函數,編譯器不會自動提供默認的構造函數。
}
}
把構造函數定義為PRivate或protectcd這樣不相關的類不能訪問他們:
在mynumber中編寫一個共有靜態屬性或方法已實例化該類。兩種有用的情況:類僅用作某些靜態成員或屬性的容器,因此永遠不會實例化它。希望類僅通過調用某個靜態成員函數來實例化。
靜態構造函數
編寫靜態構造函數的原因,類有一些靜態字段或屬性,需要在第一次使用類之前,從外部源中初始化這些靜態字段或屬性。注意,靜態構造函數沒有方法修飾符,靜態構造函數不帶任何參數,一個類也只能有一個靜態構造函數。
上面的例子說明靜態構造函數的用法。為了使用colour結構,需要引用system.drawing.dll程序集,且必須為system.drawing名稱空間加上一條using語句;
using system;
using system .Drawing;
用下面的代碼測試靜態構造函數:
運行代碼,得到以下結果:
匿名類型
var關鍵字,它用于表示隱式類型化的變量。var與new一起使用時,可以創建匿名類型,匿名類型只是一個繼承自object且沒有名稱的類。
假如需要一個對象包含某個人的姓氏,中間名和名字,則聲明如下:
結構
為結構定義函數與為類定義函數完全相同,以下代碼說明了結構的構造函數和屬性:
}
}
結構是值類型,不是引用類型,。結構不支持繼承,對于結構構造函數的工作方式有一些區別,尤其是編譯器總是提供一個無參數的默認構造函數,它不允許許替換的。
結構的構造函數
默認構造函數把數值字段都初始化為0,把引用類型字段初始化為null,總是隱式的給出。提供字段的初始化值也不能繞過默認構造函數,下面代碼產生編譯錯誤:
部分類
partial關鍵字的用法:把partial放在class,struct或interface關鍵字的前面,下例:
在嵌套的類型中,只要partial關鍵字位于class關鍵字的前面,就可以嵌套部分類。
把部分類編譯到類型中時,屬性,xml注釋,接口,泛型類型的參數屬性和成員會合并。
靜態類
如果類只包含靜態的方法和屬性,該類就是靜態的。
tostring()方法,他是快速獲取對象的字符串表示的最便捷方式。
例子;
}
}
該例子說明了如果不在自己定義的類中重寫Tostring(),該類將繼承system.object的實現方式,它顯示的名稱,如果希望tostring()返回一個字符串,其包含類中的對象的值信息。該例還說明了如何使用屬性封裝字段。
新聞熱點
疑難解答