-
屬性:封裝了 一部分對象狀態的函數成員
-
事件:簡化對象狀態轉化處理的函數成員
-
C#不支持類的多繼承(與C++不同),但可同時實現多個接口
-
C#是一種類型安全的語言,即類型只能通過定義的協議進行交互,從而保證內部類型的一致化。
-
C#支持靜態類型化,在編譯時會執行靜態類型安全性檢查
-
C#依靠運行時環境來自動的內存管理(不同於C/C++等語言,優點:程序員不需要顯式的釋放對象分配的內存資源避免了因錯誤使用指針造成的錯誤 缺點:無法向非托管語言C/C++對系統進行低級控制,完全按照自己的想法管理內存)
-
C#編譯器可以把一系列的.cs文件編譯為程序集,程序集是.Net中最小的打包和部署單元,程序集可以是一個可執行文件.exe,也可以是一個類庫文件.dll(相當於一個沒有入口的.exe)
-
C#編譯器的名稱叫csc.exe在命令行調用CSC的命令如下:
生成應用程序(.exe)
csc filename.cs
生成類庫文件(.dll)
Csc /target:libarary filename.cs
-
標識符:程序員為類、方法、字段、變量等選擇的名字
標識符是由字母/下划線開頭的Unicode字符組成的,C#標識符是區分大小寫的,通常約定參數、局部變量和私有字段應該由小寫字母開頭,而其他標識符則應該由大寫字母開頭
-
關鍵字:又稱保留字,為編譯器預留的名稱,當使用關鍵字時需要在其前面加上@符號,如string @string
注意:@不是標識符的一部分,@string和string表示的是同一個變量
-
C#預定義類型:數值類型、字符串類型、bool類型
-
C#中的所有類型都是類型的實例,值表示存儲位置的符號,變量表示它包含的值可能會不斷變化,常量則表示里面的值總是表示同一個值
-
類型的隱式轉換:編譯器能保證轉換一定能夠成功
轉換過程中不會丟失信息
類型的顯式轉換條件與上面的相對
-
C#中的類型可以分為:①值類型 ②引用類型③參數類型④指針類型
-
值類型:
數值類型、bool類型、char類型、bool類型、enum類型、struct
引用類型:
字符串、接口、類、委托、數組
引用類型和值類型的最大不同在於內存的分配方式:
值類型:通常在當前執行線程的堆棧(stack)上分配內存
引用類型:通常在托管堆(manage heap)上分配內存
-
值類型的變量或者常量的內容僅僅是一個值,值類型復制時復制的是這個值本身,引用類型又對象和對象的引用兩部分組成,引用類型的變量或常量里面存的是一個包含值的對象的引用,復制時復制的僅僅是這個引用
當一個引用類型被賦值為null時表示它不指向任何一個對象。
-
在C#中非零值除以零是無窮大,零除以零是NaN
無窮大減去無窮大NaN
各種int
Int16àshort(16位)
Int32àint(32位)
Int64àlong(64位)
-
float單精度類型,精度為5~6位(超出部分按照四舍五入規則舍去),占4個字節的存儲空間
double雙精度類型,精度為15~16位((超出部分按照四舍五入規則舍去)),占8個字節的存儲空間(聲明的小數默認都是double類型)
float和double內部都是基於2進制表示的,只有基於2表示的數值才能被精確的表示
decimal(多用於金融的數據處理方面)內部是基於10表示,可以精確的表示大多數小數(但處理速度要比處理float和double慢)
-
C#中bool類型能表示True和False,盡管這只需要1位的存儲空間,單運行時卻要使用1個字節的空間(因為字節是處理器和運行時能有效處理的最小單位),為了避免不必要的空間浪費,.Net Framework的System。Collections命名空間下有專門的BitArray類,每個布爾值占1位的空間。
-
棧是存儲參數和局部變量的地方,堆是對象殘留的內存塊,堆上可以存儲靜態字段、常量、
-
C#中的參數傳遞:
>1、值傳遞(默認的傳遞參數的方式):每次傳遞的是原值的副本,改變副本並不會影響原值
>2引用傳遞:相當於給原變量的存儲空間起了一個別名,原值和復制后的變量訪問的是同一塊內存,通過改變副本會改變原變量的值
注意:無論參數是值類型還是引用類型都可以按照引用傳遞
引用傳參有可分為兩種:ref和out
Ref:在聲明和調用時都要添加ref關鍵字
Out 和 ref類似,除了:
ref必須在使用前給變量賦值,而out不必,但out必須在函數結束前為其賦值
-
值是變量或常量表示的存儲位置,變量是表示存儲位置的符號,它包含的值可能發生變化,常量包含的自初始化后不再發生變化。
-
類型轉換
隱式轉換發生條件:
編譯器能保證轉換總是能成功
沒有信息在轉換過程中丟失
顯式轉換發生條件:
編譯器不能保證轉換總是能成功
信息在轉換過程有可能發生
-
明確賦值
<1> 局部變量在讀取錢必須明確賦值
<2> 當調用方法時必須提供函數的參數
<3>其它的所有變量(像字段和數組元素)都自動在運行時別初始化(使用其類型的默認值)
所有引用類型的默認值:null
所有數值和枚舉類型的默認值:0
字符類型默認值:'\0'
布爾類型默認值: False
能夠使用default關鍵字來獲取其關鍵值
-
C#中的屬性
當使用自動屬性時,編譯器會在后台產生私有字段,該字段名稱由編譯器生成,切不能被引用,如何希望屬性是只讀的,可以將set訪問器設置為private
C#中的屬性訪問器在系統內部被編譯為get_xxx和set_XXX方法
-
索引器
索引器為訪問類或結構體中的列表或字典提供了自然的訪問接口,索引器和屬性很相似,但索引器通過索引值而非屬性名訪問數據元素,簡化了對類中列表和字典的訪問。
要實現索引器,首先定義一個名為this的屬性,將參數定義放在一對方括號中,
Public string this[int index]{
Get{}
Set{}
}
索引器在系統內部被編譯為get_Item()和set_Item()的方法
-
C#中new 和virtual的不同:

當CLR遇到一個virtual 方法時,它會調用派生得最遠的實現並重寫virtual成員的實現。
如果重寫一個方法時沒有加上"override"關鍵字,則會報告一條警告消息。這時,可以加上"new"來消除警告。告知編譯器和其它編程人員,這個成員的隱藏不是無意的。
從C#的角度來看,new關鍵字的主要作用在於:移除編譯器的警告。
new在基類面前隱藏了派生類的重新聲明的成員。在這種情況下,不是調用派生得最遠的成員。相反,基類的成員會搜索繼承鏈,找到使用了new關鍵字的那個成員之前的成員,然后調用該成員。如果繼承鏈中只有兩個類,就會使用基類中的成員,感覺就像沒有在派生類中重寫那個成員。
-
C#構造方法
28.1、C#編譯器自動為沒有顯式提供構造方法的類生成構造函數,如果顯式指定構造函數將不再生成這個無參構造函數,對於結構體來說,這個無參構造函數是必須的,不能自己定義,其作用是用默認值來初始化每個字段。
28.2、類或結構體中的字段按照初始化順序在構造方法執行執行字段的初始化
28.3 構造函數的重載
在構造函數中可以通過this關鍵字調用所在類的其它構造函數,減少代碼重復,此時被調用的構造函數先執行
Eg:
Public class test{
Public test(string test){
}
Public test(string test,int test) :this(string test){
}
}
關鍵字base和關鍵字this類似,它有兩個重要的目的:
從子類訪問重載的基類方法成員
調用基類的構造函數
28.4 構造方法和字段的初始化順序
(1) 從子類到基類 :初始化字段à指定被調用基類的構造方法中的變量
(2)從基類到子類:構造方法體自行

-
重載和解析:
當重載被調用時,類型最明確的優先匹配,具體調用哪個重載是在編譯時確定,而不是在運行時決定
-
裝箱和拆箱
裝箱:把數值類型實例轉換為引用類型實例
拆箱:把引用類型實例轉換為數值類型實例
裝箱和拆箱的本質是復制,裝箱是把值類型的實例復制到新的引用類型中,拆箱是把引用類型中的值復制到值類型的實例中。
-
GetType()方法和TypeOf運算符
C#的所有類型在編譯和運行時期都維護一個System.Type類的實例,有兩個方法可以獲得System.Type對象
-
在類的實例上調用GetType()方法
-
在類名上使用TypeOf運算符
兩者不同在於,GetType在運行時賦值,而TypeOf運算符在編譯時賦值
-
訪問權限修飾符
-
public:完全訪問權限 ,枚舉類型成員或接口隱含的訪問權限
-
internal:盡可訪問程序集和友元程序集,非嵌套類型(比如類)的默認訪問權限
-
private:僅在類型內可見,類和結構體成員的默認訪問權限
-
protected:僅在類中和子類中可見
-
接口
-
接口的顯式實現
當 實現多個接口時,有時成員標識會有沖突,這時可以顯式實現接口來 解決沖突
Public Interface ITest{
Void DoSomething();
}
Public class Test:ITest{
ITest.DoSomething(){}//接口的顯式實現
}
❈注意:調用顯式實現的成員的唯一方法是將對象轉換為相應的接口
Test t = new Test();
(ITest)t.DoSomething();
-
虛方法實現接口成員
默認情況下,接口成員的實現都是隱式定義為sealed。為了能重載,必須在基類中標識為Virtual或abstract
Public class Test:ITest{
Public virtual void DoSomething(){}
}
❈注意:顯式實現的接口成員不能標識為virtual
