屬性:封裝了 一部分對象狀態的函數成員 事件:簡化對象狀態轉化處理的函數成員 C#不支持類的多繼承(與C++不同),但可同時實現多個介面 C#是一種類型安全的語言,即類型只能通過定義的協議進行交互,從而保證內部類型的一致化。 C#支持靜態類型化,在編譯時會執行靜態類型安全性檢查 C#依靠運行時環境來... ...
- 屬性:封裝了 一部分對象狀態的函數成員
- 事件:簡化對象狀態轉化處理的函數成員
- 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的不同:
當CIR遇到一個virtual 方法時,它會調用派生得最遠的實現並重寫virtual成員的實現。本例中Contact包含了派生得最遠的實現。
如果重寫一個方法時沒有加上"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