對.Net Framework的認識(2)


類和接口的訪問權限默認是internal,接口成員不能添加訪問修飾符,默認是public,類成員默認是private的。

C#中靜態類不能實現接口,它里面所有的成員(包括成員類型,方法等)必須是靜態的。

CLR不支持partial,那只是C#的語法,所以partial class必須用C#寫。

virtual和override,前者用於父類標識可重構的成員,后者用於子類的重構,virtual方法最好少用,因為性能會降低。因為非virtual方法,CLR可以很快定位到這個方法的出處,而virtual方法,CLR得先去找調用該方法的對象是哪個類型的,在確定類型之后才能定位方法的出處,如果派生層次很多很復雜的話,性能消耗就會比較大。

sealed標識密封類,即不可繼承類,不能同時使用virtual關鍵字,類申明成sealed可以提高性能,因為可以減少很多檢查和驗證。

new除了實例化對象外,當子類的方法簽名和父類一樣時,用new可以更清楚地表達子類的方法和父類沒有任何關系,如果不用的話,編譯時會警告,但還是會隱藏父類方法,使用子類自己定義的方法。

 常量的值必須在編譯時就確定,編譯后,CLR會把常量的值保存在程序集的元數據中,如果代碼中使用到常量,CLR會去元數據中查找並把常量值放入IL中。常量如果為引用類型(String除外),則只能賦值null。類中的常量字段引用方式和靜態字段一樣,即類名.字段名。

靜態字段在類型第一次被引用時初始化。實例字段則是當實例被創建時才初始化。

.ctor是實例成員初始化(包括構造方法),.cctor是靜態類型初始化,.cctor在.ctor之前執行。.ctor執行順序是,如果實例成員在聲明時也被賦值則先執行,然后是基類構造方法,最后是該類的構造方法。

聲明成員的同時進行賦值也叫內聯初始化。

readonly用於類型時,表示該類型引用不能更改,但是引用指向的對象可以更改。

params用於定義數量不確定的參數,結構為“params 類型名[] 變量名”,它必須位於所有參數的最后一個,不能與out/ref共用,對於不同類型參數的傳入,可以用“params object[] 變量名”,不過使用params關鍵字對性能損耗有影響,所以能不用還是不用比較好。

方法的參數盡量用接口,返回值盡量用具體類。

String是個常量,一旦賦值無法更改,要更改只有生成新的String。

StringBuilder其實就是個Char數組。

枚舉類中多個符號對應一個值時,值轉符號只會返回第一個符號。枚舉成員類型默認是int型,但可以是int,uint,byte,sbyte,long,ulong,short,ushort這8種類型。枚舉類型可以用運算符。GetUnderlyingType方法可以獲取枚舉類型對應的類型,如System.Int32,使用例子如:Enum.GetUnderlyingType(typeof(Color));

數組是引用類型,[]和System.Array是一回事。

接口中不可以有靜態成員,隱式實現接口的方法必須聲明為public。

顯式實現接口的方法,即使用接口名.方法實現接口方法,不能添加訪問權限標志,默認為private,只能通過接口變量訪問,不是類對象的一部分(雖然是在類中實現的),比如void ITest.Test(){...}

值類型可以轉換成接口,不過需要先裝箱。比如:int i=1; IFormattable f=(IFormattable)i;這個過程中i就被裝箱了。

委托定義於類之外,類中定義委托成員。委托是方法的引用,引用方法時,允許委托參數是方法參數的子類,方法的返回值是委托返回值的子類。當一個委托被引用了多個方法時,如果有多個方法有返回值,則委托返回最后一個方法的返回值。當委托引用多個方法並被調用時,如果某個方法拋出異常,則后續方法將不會被執行,這個問題可以通過先調用GetInvocationList來獲取方法數組,然后遍歷數組,加上try、catch后調用各個方法來解決。

泛型支持值類型和引用類型,但不支持枚舉類型。泛型只能使用Object的方法,如果想增加可使用的方法,可以實現接口,用where語句,比如where T:IComparable<T>。泛型如果指明是值類型,則可以用new關鍵字創建對象,比如class A<T> where T:struct,或者是實現無參構造器約束,比如class A<T> where T:new(),也可以使用new創建對象。另外,class A<T> where T:class這個約束說明T可以是類/接口/委托/數組中任何一種。可以使用關鍵字default來為泛型設置默認值,比如:T temp=default(T)其中默認值為null或者0,兩個泛型如果被約束為引用類型,則可以使用==或!=來比較,如果被約束為值類型,則不可以用這兩個操作符比較,除非你自己重載,如果沒有約束,自然也不能比較。

自定義屬性有三個設置,第一個是AttributeTargets,表示屬性可以用於的范圍,比如Class,Method,All等等,默認是All,可以用操作符"|"來合並多個范圍;第二個是Inherited,表示該屬性是否可以自動用於類的子類,默認是true;第三個是AllowMultiple,表示該屬性是否可以多次用於一個對象,默認是false。

checked和unchecked關鍵字用於是否做溢出檢查,但對Decimal類型無效,默認是unchecked,因為checked會降低性能。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM