類與結構的區別是它們在內存中的存儲方式、訪問方式(相似存儲在堆上的引用類型,而結構是存儲在棧上的值類型)和它們的一些特徵。html
語法上,類與結構很是類似,主要區別是結構使用關鍵字 struct 代替 class 來聲明。編程
3.3.1 數據成員函數
數據成員是包含類數據—字段、常量和事件的成員。佈局
3.3.2 函數成員post
函數成員提供了操做類中數據的某些功能,包括方法、屬性、構造函數和析構函數(終結器)、運算符以及索引器。性能
ref 和 out 的區別:this
ref 在傳遞以前必須已經被初始化,out 則不要求。url
ref 的實質是將值類型進行引用傳遞,而 out 是爲了增長返回值。spa
命名參數:在傳遞參數的過程當中能夠指定其名字,格式爲 MethodName (ParameterName : Value )code
Params 關鍵字 : 必須在方法參數的最後面。
方法的重載:不能僅在返回類型上有區別,不能僅根據聲明 ref 、 out 或 params 之間區分。
概念:屬性是一個或一對方法,在客戶端代碼看來,它(們)是一個字段。
get訪問器不帶任何參數,且返回屬性聲明的類型。
set訪問器帶一個value參數,其類型與聲明的類型相同。
屬性的訪問修飾符:在get和set訪問器中,必須有一個具有屬性的訪問級別。
聲明構造方式就是聲明一個與包含的類同名的方法,但該方法沒有返回值。
若是提供了帶參數的構造函數,編譯器就不會自動提供默認的構造函數。
(1)靜態構造函數
編寫靜態構造函數的緣由:類中有一些靜態字段或屬性,須要在第一次使用類以前,從外部源中初始化這些字段和屬性。
.NET運行庫沒有確保何時去執行靜態構造函數,因此不該該要求在某個特定時刻執行靜態構造函數中的代碼。但能夠確保的是,它在全部引用前只會調用一次。
無參構造函數能夠與靜態構造函數在同一個類中定義。
(2)從構造函數中調用其它構造函數
base 與 this 關鍵字
3.3.3 只讀字段
readonly 與 const 的區別:
readonly 能夠在構造函數中賦值,而 const 哪裏都不能賦值,只能初始化。
var 和 new 關鍵字一塊兒使用能夠建立匿名類型,例如。
1 static void Main(string[] args) 2 3 4 { 5 6 7 var test = new { Name = "Earl Jones", Age = 17 }; 8 9 10 Console.WriteLine(test.ToString()); 11 12 13 Console.WriteLine(test.Name.GetType().ToString()); 14 15 16 Console.WriteLine(test.Age.GetType().ToString()); 17 18 19 Console.ReadKey(); 20 21 22 }
輸出結果以下:
咱們並不知道這個對象的類型,編譯器爲其「僞造」了一個名稱,可是隻有編譯器才能使用它,咱們不能也不該該使用新對象上的任何類型反射,由於這不會獲得一致的結果。
1 MyStruct myStruct /*= new MyStruct()*/; 2 myStruct.Name = "Earl Jones"; 3 myStruct.Age = 17;
覆蓋結構默認的構造函數會報錯:
在代碼中實例化一個類或結構時,只要有代碼引用它,就會造成強引用。
強引用和弱引用的區別是,強引用只要有引用就不會被GC回收,而弱引用隨時均可能被GC回收,因此使用它的時候必須肯定其是否存活。如:
1 MyClass myClass; 2 WeakReference weakMyClass = new WeakReference(new MyClass());
3 if (weakMyClass.IsAlive) 4 { 5 myClass = weakMyClass.Target as MyClass; 6 Console.WriteLine(myClass.value); 7 }
Partial關鍵字能夠容許把類、結構、方法或結構放在多個文件中。
若是聲明相似使用了下面的關鍵字,這些關鍵字就必須應用於同一個類的全部部分:
全部類都繼承自System.Object類。
方法:
擴展方法用於在某些不能直接修改源代碼中的類中添加方法。
1 using System; 2 3 namespace 擴展方法 4 { 5 class Program 6 { 7 static void Main(string[] args) 8 { 9 MyClass myClass1 = new MyClass(); 10 myClass1.SayHiToSomeone(); 11 myClass1.SayHi(); 12 Console.ReadKey(); 13 } 14 } 15 16 class MyClass 17 { 18 public void SayHi() 19 { 20 Console.WriteLine("我是最原始的方法"); 21 } 22 } 23 24 static class AddMyClass 25 { 26 static public void SayHiToSomeone(this MyClass myClass) 27 { 28 Console.WriteLine("我是一個擴展方法"); 29 } 30 31 static public void SayHi(this MyClass myClass) 32 { 33 Console.WriteLine("我是擴展方法SayHi"); 34 } 35 } 36 }
輸出的結果:
由上得出:
本文部分摘錄自C#高級編程第九版,其他由Earl Jones整理及總結而成,本人能力有限,若有紕漏望及時指出。
若是你喜歡此書,或想了解更詳細內容,請購買正版書籍進行查閱。
轉載請註明出處。