標籤:des blog color io os 使用 ar strong 檔案
1.1 類和結構
類是儲存在堆上的參考型別,而結構是儲存在棧上的實值型別.
類使用的關鍵詞是class,而結構使用的是struct生聲明.
1.2 資料成員
資料成員是包含類的資料-----欄位,常量和事件的成員.資料成員可以是待用資料.類成員總是執行個體成員,除非用static進行顯式聲明.
常量與類的關聯方式同變數與類的關聯方式.使用const關鍵字來聲明常量.
如果聲明為public就可以在類的外部存取它
事件是類的成員,在發生某些行為(如改變類的欄位或屬性,或者進行了某種形式的使用者互動操作)時,
它可以讓對象通知調用方.客戶可以包含所謂"事件處理常式"的代碼來響應該時間.
1.3 函數成員
函數成員提供操作類中資料的某些功能,包括方法,屬性,建構函式和終結器,運算子以及索引器.
1.4 方法
(1)聲明方法
方法定義包括任意方法修飾符,傳回值的類型,然後依次是方法名和輸入參數的列表和方法體.
public string GetUserName([parameters])
{
return ;
}
如果沒有傳回值指定void
(2)方法的調用
string name=GetUserName([parameters]);
(3)方法傳遞參數
class Program{ static void SomeFunction(int[] ints, ref int i) { ints[0] = 100; i = 100; } public static int Main() { int i = 0; int[] ints = { 0, 1, 2, 4, 8 }; Console.WriteLine("i=" + i); Console.WriteLine("ints[0]=" + ints[0]); Console.WriteLine("Calling SomeFunction."); SomeFunction(ints,ref i); Console.WriteLine("i=" + i); Console.WriteLine("ints[0]=" + ints[0]); Console.ReadKey(); return 0; }}
結果為
i =0
ints[0]=0
Calling SomeFunction
i = 100
ints[0]=100
ref關鍵字,如果把一個參數傳遞給方法,且這個方法的輸入參數前帶有ref關鍵字,則該方法對變數所做的任何改變都會影響原始對象的值.
(4)out參數
在方法的輸入參數前面加上out首碼時,傳遞給該方法的變數可以不初始化.該變數通過引用傳遞,所以在從被調用的方法中返回時
對應方法對該變數進行的任何改變都會保留下來,在調用該方法時,還需要使用out關鍵字,在與定義該方法時一樣.
(5) 方法的重載
聲明同名但參數個數或類型不同的方法即可.
class MyClass{ int DoSomething(int x) { DoSomething(x,10); } int DoSomething(int x,int y) { //方法實現 }}
1.5 屬性
屬性其實就是一個方法或一對方法,在用戶端代碼看來就是一個欄位.例如Windows表單的Height屬性.
public string Name{ get { return _name; } set { _name = value; }}
1.6 建構函式
一般情況下如果沒有提供任何建構函式,編譯器會在後台建立一個預設的建構函式.如果提供了帶參數的建構函式
編譯器就不會自動提供.
public class MyNumber{ private int number; private MyNumber(int number) { this.number = number; }}
(1)靜態建構函式
為何使用靜態建構函式:當我們第一次使用類之前,從外部源中初始化這些靜態欄位和屬性的時候.
public class UserPreferences{ public static readonly Color BackColor; static UserPreferences() { DateTime now = DateTime.Now; if(now.DayOfWeek == DayOfWeek.Saturday||now.DayOfWeek == DayOfWeek.Sunday) BackColor= Color.Green; else BackColor = Color.Red; } private UserPreferences() { }}
編譯UserPreferences.BackColor.ToString();
得到的結果 Red如果在周末執行Green
(2)建構函式相互調用
class Car { private string description; private uint nWheels; public Car(string description,uint nWheels) { this.description = description; this.nWheels = nWheels; } public Car(string description) { this.description = description; this.nWheels = 4; } }
這兩個建構函式初始化了相同的欄位,顯然最好把所有的代碼放在同一個地方,利用建構函式初始化器可以實現.
class Car { private string description; private uint nWheels; public Car(string description,uint nWheels) { this.description = description; this.nWheels = nWheels; } public Car(string description):this(description,4) { } }
唯讀欄位
唯讀欄位即不可修改.readonly關鍵字比const靈活得多,允許把一個欄位設定為常量,但還需要執行一些計算,以確定它的初始值.
其規則是可以再建構函式中給唯讀欄位賦值,但不能再其他地方賦值.唯讀欄位還可以是一個執行個體欄位,而不是靜態欄位.
class Car
{ public static readonly uint MaxDocuments; static Car() { MaxDocuments = DoSomethingToFindOutMaxNumber(); }}
在本例中,欄位是靜態,每次運行程式的執行個體,只需儲存MaxDocuments一次.這就是在靜態建構函式中初始化它的原因.
匿名型別
var關鍵字建立匿名型別
1.7 結構
結構是實值型別,不是參考型別.它們儲存在棧中或儲存為內聯,其生存周期的限制與簡單的資料類型一樣.
結構不支援繼承
對於結構建構函式的工作方式有一些區別,尤其是編譯器總是提供一個無參數的預設建構函式,它是不允許替換的.
使用結構,可以置頂欄位如何在記憶體中的布局.
結構的預設建構函式把數值欄位都初始化為0,把參考型別欄位初始化為null,且總是隱式給出,即使提供了其他帶
參數的建構函式,也是如此,提供欄位的初始值也不能繞過預設建構函式.
下面代碼會產生編譯錯誤
struct Dimensions { public double Length = 1; public double Width = 2; }
1.8 部分類
partial關鍵字允許把類,結構或介面放在多個檔案中.一般情況下,一個類全部駐留在單個檔案中.
partial class TheBigClass : TheBigBaseClass, IBigClass { public void MethodOne() { } } partial class TheBigClass : IOtherBigClass { public void MethodTwo() { } }
編譯之後等價於
partial class TheBigClass : TheBigBaseClass, IBigClass,IOtherBigClass { public void MethodOne() { } public void MethodTwo() { } }
1.9 靜態類
如果類中只包含靜態方法和屬性,該類就是靜態.
static class StaticUtilities{ public static void HelperMethod() { }}
調用HelperMethod()不需要StaticUtilities類型的對象.直接StaticUtilities.HelperMethod();
2.0 Object類
所有的.NET類都派生自System.Object
ToString()方法---格式化
GetHashTable()方法----索引值擷取
Equals()方法---對象比較
Finalize()-----記憶體回收
GetType()----擷取類資訊
MemberwiseClone()---複製對象
飄過來學C#系列(1)之------對象和類型