C#類型的取值範圍html
名稱 | CTS類型 | 說明 | 範圍 |
---|---|---|---|
sbyte | System.SByte | 8位有符號的整數 | -128~127(−27−27~27−127−1) |
short | System.Int16 | 16位有符號的整數 | -32 768~32 767(−215−215~215−1215−1) |
int | System.Int32 | 32位有符號的整數 | -2 147 483 648~2 147 483 647(−231−231~231−1231−1) |
long | System.Int64 | 64位有符號的整數 | −263−263~263−1263−1 |
byte | System.Byte | 8位無符號的整數 | 0~255(0~28−128−1) |
ushort | System.UInt16 | 16位無符號的整數 | 0~65535(0~216−1216−1) |
uint | System.UInt32 | 32位無符號的整數 | 0~4 294 967 295(0~232−1232−1) |
ulong | System.UInt64 | 64位無符號的整數 | 0~18 446 744 073 709 551 615(0~264−1264−1) |
訪問限制符正則表達式
修飾符 | 應用於 | 說明 |
---|---|---|
public | 全部類型或成員 | 任何代碼都可以訪問該項 |
protected | 類型和內嵌類型的全部成員 | 只有派生的類型可以訪問該項 |
internal | 全部類型或成員 | 只能在包含它的程序集中訪問該項 |
private | 類型和內嵌類型的全部成員 | 只能在它所屬的類型中訪問該項 |
protected internal | 類型和內嵌類型的全部成員 | 只能在包含它的程序集和派生類型的任何代碼中訪問該項 |
C#常見的修飾符算法
修飾符 | 應用於 | 說明 |
---|---|---|
new | 函數成員 | 成員用相同的簽名隱藏繼承的成員 |
static | 全部成員 | 成員不做用於類的具體實例 |
virtual | 僅函數成員 | 成員能夠由派生類重寫 |
abstract | 僅函數成員 | 虛擬成員定義了成員的簽名,但沒有提供實現代碼 |
override | 僅函數成員 | 成員重寫了繼承的虛擬或抽象成員 |
sealed | 類、方法和屬性 | 對於類,不能繼承自密封類。對於屬性和方法,成員重寫已繼承的虛擬成員,但任何派生類中的任何成員都不能重寫該成員。該修飾符必須與override一塊兒使用 |
extern | 僅靜態[DllImport]方法 | 成員在外部用另外一種語言實現 |
結構體編程
new
運算符與類和其餘引用類型的工做方式不一樣。new
運算符並不分配堆中的內存,而是隻調用相應的構造函數,根據傳送給它的參數初始化全部的字段。new
運算符,或者給全部的字段分別賦值,結構就徹底初始化了。固然,若是結構定義爲類的成員字段,在初始化包含的對象時,該結構會自動初始化爲0。System.Object
。所以,結構也能夠訪問System.Object
的方法。在結構中,甚至能夠重寫System.Object
中的方法————如重寫ToString()
方法。結構的繼承鏈是:每一個結構派生自System.ValueType
類,System.ValueType
類又派生自System.Object
。ValueType
並無給Object
添加任何新成員,但提供了一些更適合結構的實現方式。注意,不能爲結構提供其餘基類,每一個結構都派生自ValueType
。null
,且老是隱式地給出,即便提供了其餘帶參數的構造函數,也是如此。提供字段的初始值也不能繞過默認構造函數。擴展方法數組
this
關鍵字的後面。var
關鍵字。編譯器能夠根據變量的初始化值「推斷 」 變量的類型。使用var關鍵字須要遵循的一些規則:安全
密封類和密封方法數據結構
sealed
。對於類,這表示不能繼承該類;對於方法,這表示不能重寫該方法。sealed
時,最可能的情形是:若是要對庫、類或本身編寫的其餘類做用域以外的類或方法進行操做,則重寫某些功能會致使代碼混亂。也能夠因商業緣由把類或方法標記爲sealed
,以防第三方以違反受權協議的方式擴展該類。但通常狀況下,在把類或成員標記爲sealed
時要當心,由於這麼作會嚴重限制它的使用方式。即便認爲它不能對繼承自一個類或重寫類的某個成員發揮做用,仍有可能在未來的某個時刻,有人會遇到咱們沒有預料到的情形,此時這麼作就頗有用。.Net基類庫大量使用了密封類 ,使但願從這些類中派生出本身的類的第三方開發人員沒法訪問這些類。例如,string
就是一個密封類。約束ide
約束 | 說明 |
---|---|
where T : struct | 對於結構約束,類型T必須是值類型 |
where T : class | 類約束指定類型T必須是引用類型 |
where T : IFoo | 指定類型T必須實現接口IFoo |
where T : Foo | 指定類型T必須派生自基類Foo |
where T : new() | 這是一個構造函數約束,指定類型T必須有一個默認構造函數 |
where T1 : T2 | 這個約束也能夠指定類型T1派生自泛型類型T2。該約束也稱爲裸類型約束 |
where
子句的一個重要限制是,不能定義必須由泛型類型實現的運算符。運算符不能再借口中定義。在where
子句中,只能定義基類、接口和默認構造函數。複製數組函數
Array
類使用QuickSort
算法對數組中的元素進行排序。Array
類中的Sort()方法須要數組中的元素實現IComparable
接口。簡單類型(如System.String和System.Int32)已經實現了IComparable接口。佈局
元組
.NET 4
定義了8個泛型Tuple
類和一個靜態Tuple
類,不一樣泛型Tuple
類支持不一樣數量的元素。例如,Tuple<T1>
包含一個元素,Tuple<T1, T2>
包含兩個元素,以此類推。代碼示例:
public class TupleExample { static void Main() { TupleExample example = new TupleExample(); var result = example.Divide(5, 2); Console.WriteLine("result of division: {0}, reminder: {1}", result.Item1, result.Item2); } public static Tuple<int, int> Divide(int dividend, int divisor) { int result = dividend / divisor; int reminder = dividend % divisor; return TupleExample.Create<int, int>(result, reminder); } }
若是元組包含項超過8個,就可使用帶8個參數的Tuple類定義。最後一個模板參數是TRest,表示必須給它傳遞一個元組,這樣就能夠建立帶任意個參數的元組了。示例:
var tuple = Tuple.Create<string, string, string, int, int, int, double, Tuple<int, int>>("Stephanie", "Alina", "Nagel", 2009, 6, 2, 1.37, Tuple.Create<int, int>(52, 3490));
運算符
is
運算符:能夠檢查對象是否與特定的類型兼容。「兼容」表示對象是該類型或者派生自該類型。as
運算符:用於執行引用類型的顯示類型轉換。若是要轉換的類型與制定的類型兼容,轉換就會成功進行;若是類型不兼容,as
運算符就會返回null
值。sizeof
運算符:使用該運算符能夠肯定棧中值類型須要的長度(單位是字節);若是對於複雜類型(和非基元類型)使用該運算符,就須要把代碼寫在unsafe
塊中,如:unsafe{Console.WriteLine(sizeof(Customer));}
null
,其結果就是null
。如: int? a = null;
int? b = a + 4; // b = null
int? c = a * 5; // c = null
null
可能的值。這個運算符放在兩個操做數之間,第一個操做數必須是一個可空類型或者引用類型;第二個操做數必須與第一個操做數的類型相同,或者能夠隱含地轉換爲第一個操做數的類型。比較引用類型的相等性
true
,不然返回false
。可是它認爲null
等於null
。另外,該方法在應用於值類型時,它老是返回false,由於爲了調用這個方法,值類型須要裝箱到對象中。System.Object
實現代碼也能夠比較引用。但由於這個方法是虛擬的,因此能夠在本身的類中重寫它,從而按值來比較對象。特別是若是但願類的實例用做字典中的鍵,就須要重寫這個方法,以比較相關值。不然,根據重寫Object.GetHashCode()
的方式,包含對象的字典類要麼不工做,要麼工做的效率很是低。在重寫Equals()方法時要注意,重寫的代碼不會拋出異常。同理,這是由於若是拋出異常,字典類就會出問題,一些在內部調用這個方法的.NET
基類也可能出問題。null
的狀況,所以,若是一個對象多是null
,這個方法就能夠拋出異常,提供額外保護。靜態重載版本首先要檢查它傳遞的引用是否爲null
。若是他們都是null
,就返回true
(由於null
與null
相等)。若是隻有一個引用是null
,就返回false
。若是兩個引用實際上引用了某個對象,它就調用Equals()的虛擬實例版本。這表示在重寫Equals()的實例版本時,其效果至關於也重寫了靜態版本。bool b = (x == y);// x, y object references
運算符重載
operator
關鍵字告訴編譯器,它其實是一個自定義的運算符重載,後面是相關運算符的實際符號,返回類型是在使用這個運算符時得到的類型。+
和-
運算符,第一個參數是運算符左邊的值,第二個參數是運算符右邊的值。lhs
,運算符右邊的參數命名爲rhs
。public
和static
,這表示它們與它們的類或結構相關聯,而不是與某個特定實例相關聯,因此運算符重載的代碼體不能訪問非靜態類成員,也不能訪問this
標識符。==
,也就必須重載!=
;不然會產生編譯錯誤。另外,比較運算符必須返回布爾類型的值。這是它們與算術運算符的根本區別。==
和!=
時,還必須重載從System.Object
中繼承的Equals()和GetHashCode()方法,不然會產生一個編譯警告。緣由是Equals()方法應實現與==
運算符相同類型的相等邏輯。委託
Action
Action
是無返回值的泛型委託。Action
表示無參,無返回值的委託Action<int,string>
表示有傳入參數int
,string
無返回值的委託Action<int,string,bool>
表示有傳入參數int
,string
,bool
無返回值的委託Action<int,int,int,int>
表示有傳入4個int
型參數,無返回值的委託Action
至少0個參數,至多16個參數,無返回值。Func
Func
是有返回值的泛型委託Func<int>
表示無參,返回值爲int的委託Func<object,string,int>
表示傳入參數爲object
, string
返回值爲int的委託Func<object,string,int>
表示傳入參數爲object
, string
返回值爲int的委託Func<T1,T2,,T3,int>
表示傳入參數爲T1
,T2
,T3
(泛型)返回值爲int
的委託Func
至少0個參數,至多16個參數,根據返回值泛型返回。必須有返回值,不可void
Lambda
表達式
Lambda
表達式。或者說Lambda
表達式能夠用於類型是一個委託的任意地方。Lambda
表達式只有一條語句,在方法塊內就不須要花括號和return
語句,由於編譯器會添加一條隱式return
語句。正則表達式
符 號 | 含 義 | 示 例 | 匹配的示例 |
---|---|---|---|
^ | 輸入文本的開頭 | ^B | B,但只能是文本中的第一個字符 |
$ | 輸入文本的結尾 | X$ | X,但只能是文本中的最後一個字符 |
. | 除了換行符(\n)之外的全部單個字符 | i.ation | isation、ization |
* | 能夠重複0次或屢次的前導字符 | ra*t | rt、rat、raat和raaat等 |
+ | 能夠重複1次或屢次的前導字符 | ra+t | rat、raat和raaat等(但不能是rt) |
? | 能夠重複0次或1次的前導字符 | ra?t | 只有rt和rat匹配 |
\s | 任何空白字符 | \sa | [space]a、\ta、\na(其中[space]表示空格,\t和\n都是轉移字符) |
\S | 任何不是空白的字符 | \SF | aF、rF、cF,但不能是\tF |
\b | 字邊界 | ion\b | 以ion結尾的任何字 |
\B | 不是字邊界的任意位置 | \BX\B | 字中間的任何X |
[1|c]
表示字符能夠是1
或c
。在方括號中,也能夠指定一個範圍,例如[a-z]
表示全部的小寫字母,[A-E]
表示A
~E
之間的全部大寫字母(包括字母A
和E
),[0-9]
表示一個數字。若是要搜索一個整數,就能夠編寫[0-9]+
。集合
LinkedList<T>
是一個雙向鏈表,其元素指向它前面和後面的元素。其特色是:插入快,查找慢。SortedList<TKey,TValue>
類,這個類按照鍵給元素排序。List<T>
類,但沒有在內存中移動後續元素的性能開銷。int
由字典用於計算在對應位置放置元素的索引。IEquatable<T>.Equals()
方法,或重寫Object
類的Equals()方法。由於不一樣的鍵對象可能返回相同的散列代碼,因此字典使用Equals()方法來比較鍵。GetHashCode()方法的實現代碼必須知足以下要求:
int
能夠存儲的整個數字範圍上。若是爲Equals()方法提供了重寫版本,但沒有提供GetHashCode()方法的重寫版本,C#編譯器就會顯示一個編譯警告。
LINQ
from
子句開頭,以select
或group
子句結束。在這兩個子句之間,可使用where
、orderby
、join
、let
和其餘from
子句。LINQ
爲IEnumerable<T>
接口提供了各類擴展方法,以便用戶在實現了該接口的任意集合上使用LINQ
查詢。釋放非託管的資源
System.IDisposable
接口。析構函數
IDisposable接口
System.IDisposable
接口替代析構函數。IDisposable
接口定義了一種模式(具備語言級的支持),該模式爲釋放非託管的資源提供了肯定的機制,並避免產生析構函數固有的與垃圾回收器相關的問題。IDisposable
接口聲明瞭一個Dispos()方法,它不帶參數,返回void
。IDisposable
接口的封裝對象上調用Dispose()方法。這樣,Dispose()方法爲什麼時釋放非託管資源提供了精確的控制。聲明:本文歡迎轉載和分享,可是請尊重做者的勞動成果,轉載分享時請註明出處:http://www.cnblogs.com/davidsheh/p/5236686.html 。同時,碼字實在不易,若是你以爲筆者分享的筆記對你有點用處,請順手點擊下方的推薦,謝謝! |