void 無(wú)返回值
命名空間:using語(yǔ)句 只能用于命名空間
C# 命名方法:
變量名----Camel方法 someVariableName
類(lèi),命名空間,函數(shù) ------Pascal方法,SomeFunction
C# static用法:
靜態(tài)類(lèi)不能實(shí)例化
不能使用new 關(guān)鍵字創(chuàng)建靜態(tài)類(lèi)類(lèi)型的變量
因?yàn)闆](méi)有實(shí)例變量,所以要使用類(lèi)名本身訪問(wèn)靜態(tài)類(lèi)的成員。
new一個(gè)int時(shí),new運(yùn)算符用于初始化其值為0。不管是重寫(xiě)還是覆蓋都不會(huì)影響父類(lèi)自身的功能。只在子類(lèi)上生效。
VS2008快捷鍵操作:
F9:調(diào)試斷點(diǎn)設(shè)置
F10:?jiǎn)尾綀?zhí)行
F11:?jiǎn)尾竭M(jìn)入
F12:跳轉(zhuǎn)到函數(shù)定義處
C# 是一個(gè)強(qiáng)類(lèi)型語(yǔ)言,區(qū)分大小寫(xiě)
C#中的深拷貝與淺拷貝
深拷貝:又稱(chēng)深度克隆,它完全是新對(duì)象的產(chǎn)生,不僅復(fù)制所有的非靜態(tài)值類(lèi)型成員,而且復(fù)制所有引用類(lèi)型成員的實(shí)際對(duì)象。(即棧上和堆上的成員均進(jìn)行復(fù)制)
淺拷貝:又稱(chēng)影子克隆,只復(fù)制原始對(duì)象中的所有的非靜態(tài)的值類(lèi)型成員和所有引用類(lèi)型成員的引用,就是說(shuō),原始對(duì)象和新對(duì)象共享所有引用類(lèi)型成員的對(duì)象實(shí)例。(即只復(fù)制棧上的成員)
常見(jiàn)轉(zhuǎn)義字符:
\0 null
\b 退格
\f 走紙換頁(yè)
\n 換行
\r 回車(chē)
\t 橫向跳到下一制表位置
\v 豎向跳到下一制表位置
字符串表示:
” 包裹字符串
’ 包裹單個(gè)字符
多條語(yǔ)句放在一行,需用分號(hào)進(jìn)行分割。
用于條件編譯或劃分代碼塊。
如:#if #else #define #region #endregion
@ 符號(hào)的兩種用法:
1、常用在字符串開(kāi)頭,它可以告訴編譯器忽略轉(zhuǎn)義符;
2、當(dāng)給變量或?qū)傩匀∶麜r(shí),變量名(或?qū)傩悦┡c.net中的關(guān)鍵字相同沖突,可以使用“@變量名”來(lái)繞過(guò)限制。
如:int @int = 123;
//這里@int變量用Reflector查看IL變量時(shí),看到的是int,而不是@int。
隱式轉(zhuǎn)換的要求:
數(shù)值類(lèi)型小范圍轉(zhuǎn)大范圍可以,大范圍轉(zhuǎn)小范圍需要強(qiáng)制轉(zhuǎn)換。
值類(lèi)型:
基于值類(lèi)型的變量直接包含值。 將一個(gè)值類(lèi)型變量賦給另一個(gè)值類(lèi)型變量時(shí),將復(fù)制包含的值。 這與引用類(lèi)型變量的賦值不同,引用類(lèi)型變量的賦值只復(fù)制對(duì)對(duì)象的引用,而不復(fù)制對(duì)象本身。
所有的值類(lèi)型均隱式派生自 [System.ValueType]與引用類(lèi)型不同,不能從值類(lèi)型派生出新的類(lèi)型。 但與引用類(lèi)型相同的是,結(jié)構(gòu)也可以實(shí)現(xiàn)接口。與引用類(lèi)型不同,值類(lèi)型無(wú)法包含 null值。 但是,[可以為 null 的類(lèi)型]功能允許值類(lèi)型分配給 null。每種值類(lèi)型均有一個(gè)隱式的默認(rèn)構(gòu)造函數(shù)來(lái)初始化該類(lèi)型的默認(rèn)值。 有關(guān)值類(lèi)型的默認(rèn)值的信息。
enum枚舉用法語(yǔ)句分號(hào)結(jié)尾,空白可以忽略
C#關(guān)鍵字統(tǒng)統(tǒng)為小寫(xiě),關(guān)鍵字與標(biāo)識(shí)符之間的空白不多余,C#語(yǔ)句必須以分號(hào); 分隔
switch(){case 1: ;break;}break在每個(gè)case后面
do...while語(yǔ)句至少會(huì)執(zhí)行一次for(初始化語(yǔ)句;表達(dá)式;遞增語(yǔ)句)語(yǔ)句
C# continue與break
continue 跳過(guò)此次判斷,但不跳出for循環(huán)
break 直接跳出for循環(huán)
一個(gè)變量使用前綴或后綴方式增1的結(jié)果是一樣的。但,如果涉及到增1后的賦值,前綴增1會(huì)把增1后的值賦值給其它變量,而后綴增1會(huì)把增1前的值賦值給其它變量。自增減1與自增增1類(lèi)似。
短路測(cè)試:and 左半部分為假,則不需檢查后半部分,or左半部分為真,則不需檢查右半部分操作符優(yōu)先級(jí)表預(yù)處理指令是怎樣的?
訪問(wèn)修飾符:
public:完全公開(kāi)
private:完全私有
protected:當(dāng)前class與繼承class
internal:同一程序集
protected internal: 同一程序集或繼承的子類(lèi)可訪問(wèn)
sealed:只能用來(lái)修飾class,表示class不能被繼承
C#中 this的相關(guān)用法
1、限定被相似的名稱(chēng)隱藏的成員
2、將對(duì)象作為參數(shù)傳遞到其他方法
3、聲明索引器
4、擴(kuò)展對(duì)象的方法
C#構(gòu)造函數(shù): 函數(shù)名與類(lèi)名相同
構(gòu)造函數(shù)的作用:
1、當(dāng)一個(gè)類(lèi)在new實(shí)例化對(duì)象時(shí),可調(diào)用構(gòu)造函數(shù)進(jìn)行初始化對(duì)象。
2、不帶參數(shù)的構(gòu)造函數(shù)稱(chēng)為“默認(rèn)構(gòu)造函數(shù)”。 無(wú)論何時(shí),只要使用 new 運(yùn)算符實(shí)例化對(duì)象,并且不為 new 提供任何參數(shù),就會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù)。除非類(lèi)是static的,否則 C# 編譯器將為無(wú)構(gòu)造函數(shù)的類(lèi)提供一個(gè)公共的默認(rèn)構(gòu)造函數(shù),以便該類(lèi)可以實(shí)例化。
3、通過(guò)將構(gòu)造函數(shù)設(shè)置為私有構(gòu)造函數(shù)可以阻止類(lèi)被實(shí)例化。
4、結(jié)構(gòu)類(lèi)型的構(gòu)造函數(shù)與類(lèi)的構(gòu)造函數(shù)類(lèi)似,但是 structs 不能包含顯式默認(rèn)構(gòu)造函數(shù),因?yàn)榫幾g器將自動(dòng)提供一個(gè)構(gòu)造函數(shù)。此構(gòu)造函數(shù)會(huì)將struct中的每個(gè)字段初始化為默認(rèn)值。只有當(dāng) struct 用 new 實(shí)例化時(shí),才會(huì)調(diào)用此默認(rèn)構(gòu)造函數(shù)。
構(gòu)造方法與類(lèi)名相同,構(gòu)造方法沒(méi)有返回值類(lèi)型,構(gòu)造方法通常申明為public,在結(jié)構(gòu)中不允許用戶(hù)定義無(wú)參數(shù)構(gòu)造函數(shù)
在類(lèi)中允許用戶(hù)定義無(wú)參數(shù)的構(gòu)造函數(shù)
結(jié)構(gòu)中必須給所有的字段賦值
枚舉類(lèi)型是值類(lèi)型,不能夠定義字段屬性和方法
抽象類(lèi)僅供派生,無(wú)法實(shí)例化
聲明類(lèi)以實(shí)現(xiàn)接口,類(lèi)似于從基類(lèi)派生------要實(shí)現(xiàn)的接口和基類(lèi)名稱(chēng)以逗號(hào)分隔(基類(lèi)在前,接口順序任意)
類(lèi)可以實(shí)現(xiàn)多個(gè)接口,但只能從一個(gè)基類(lèi)派生
接口的重要特征是不能夠?qū)嵗荒苁褂胣ew創(chuàng)建接口
函數(shù)在重載時(shí),利用函數(shù)簽名的不同(即參數(shù)個(gè)數(shù)與類(lèi)型的不同)來(lái)區(qū)別調(diào)用者到底調(diào)用的是那個(gè)方法
C#中的char 和 string
char字符類(lèi)型,值類(lèi)型,固定長(zhǎng)度
string字符串類(lèi)型,引用類(lèi)型
C# 結(jié)構(gòu)體與類(lèi) 的不同
在C#中結(jié)構(gòu)體和類(lèi)似乎就是一樣的, 結(jié)構(gòu)與類(lèi)共享大多數(shù)相同的語(yǔ)法,但結(jié)構(gòu)比類(lèi)受到的限制更多。
首先,C#中結(jié)構(gòu)體和類(lèi)的最大區(qū)別就是結(jié)構(gòu)體是值類(lèi)型,而類(lèi)是引用類(lèi)型。也就是說(shuō)當(dāng)實(shí)例化結(jié)構(gòu)體的時(shí)候是在棧上拷貝了結(jié)構(gòu)體的一個(gè)副本,而類(lèi)實(shí)例化的時(shí)候是在棧上分配一個(gè)指針指向了堆中分配的空間。
其次,在結(jié)構(gòu)體中,除非字段被聲明為const或static,否則是無(wú)法初始化的。
結(jié)構(gòu)體不能聲明默認(rèn)構(gòu)造函數(shù)(沒(méi)有參數(shù)的構(gòu)造函數(shù))或析構(gòu)函數(shù)。這里能細(xì)說(shuō)下,細(xì)心的網(wǎng)友可能發(fā)現(xiàn)我上面定義的結(jié)構(gòu)體和類(lèi)中各自的構(gòu)造函數(shù)是稍微有點(diǎn)不同的,在結(jié)構(gòu)體的構(gòu)造函數(shù)后面還加了個(gè):this()。
C#在中 只有單繼承,但是可以用接口實(shí)現(xiàn)類(lèi)似多繼承的效果
結(jié)尾return;含義: 跳出方法體,結(jié)束此方法
==操作比較的是兩個(gè)變量的值是否相等,對(duì)于引用型變量表示的是兩個(gè)變量在堆中存儲(chǔ)的地址是否相同,即棧中的內(nèi)容是否相同
equals操作表示的兩個(gè)變量是否是對(duì)同一個(gè)對(duì)象的引用,即堆中的內(nèi)容是否相同
在C#中,string是System.String 的別名
C#引用類(lèi)型有六種:class、interface、delegate、object、string、Array(string也是引用類(lèi)型)
裝箱是將值類(lèi)型轉(zhuǎn)換為引用類(lèi)型 ;拆箱是將引用類(lèi)型轉(zhuǎn)換為值類(lèi)型
C# 需方法接口定義的格式,在調(diào)用的是一定要遵循抽象方法,沒(méi)有方法體。也不能實(shí)例化、選擇使用虛方法實(shí)現(xiàn)多態(tài)還是抽象類(lèi)抽象方法實(shí)現(xiàn)多態(tài),取決于我們是否需要使用基類(lèi)實(shí)例化的對(duì)象.(虛方法可以實(shí)例化,抽象方法不能夠?qū)嵗?
接口無(wú)訪問(wèn)修飾符,隱含public多接口,擴(kuò)展接口C# ,接口不允許多重繼承,通過(guò)接口進(jìn)行實(shí)現(xiàn)如果兩個(gè)接口有相同的方法,則必須顯示實(shí)現(xiàn)至少一個(gè)方法。
重載:允許你以相同的名稱(chēng)不同的參數(shù)來(lái)調(diào)用多個(gè)方法
重寫(xiě):是指子類(lèi)對(duì)父類(lèi)中虛函數(shù)或抽象函數(shù)的“覆蓋”。重寫(xiě)的父類(lèi)中的方法必須用 virtual、abstract 或 override 修飾,且不能重寫(xiě)非虛方法或靜態(tài)方法。override的方法和virtual的方法必須具有相同的訪問(wèn)級(jí)別修飾符。
隱藏:在子類(lèi)中寫(xiě)一個(gè)和基類(lèi)一樣名字(參數(shù)不同也算)的非虛方法,會(huì)讓基類(lèi)中的函數(shù)被隱藏,編譯后會(huì)提示要求使用New關(guān)鍵字來(lái)顯示的隱藏基類(lèi)的方法。
句柄是什么東西?
句柄就是個(gè)數(shù)字,一般和當(dāng)前系統(tǒng)下的整數(shù)的位數(shù)一樣,比如32bit系統(tǒng)下就是4個(gè)字節(jié)。這個(gè)數(shù)字是一個(gè)對(duì)象的唯一標(biāo)示,和對(duì)象一一對(duì)應(yīng)。這個(gè)對(duì)象可以是一個(gè)塊內(nèi)存,一個(gè)資源,或者一個(gè)服務(wù)的context(如 socket,thread)等等。
這個(gè)數(shù)字的來(lái)源可以有很多中,只要能保證和它代表的對(duì)象保持唯一對(duì)應(yīng)就可以,比如可以用內(nèi)存地址,也可以用句柄表的序號(hào),或者干脆用一個(gè)自增ID,再或者用以上的值去異或一個(gè)常數(shù)。
傳統(tǒng)上操作系統(tǒng)內(nèi)核和系統(tǒng)服務(wù)API都是 C 語(yǔ)言接口的,但是其內(nèi)部設(shè)計(jì)理念上又是OO的,所以有對(duì)象概念卻沒(méi)有對(duì)應(yīng)的語(yǔ)言語(yǔ)法支持。句柄的作用就是在 C 語(yǔ)言環(huán)境下代替 C++ 的對(duì)象指針來(lái)用的。創(chuàng)建句柄就是構(gòu)造,銷(xiāo)毀句柄就是析構(gòu),用句柄調(diào)用函數(shù)相當(dāng)于傳入this指針。
如果有系統(tǒng)API是 C++ 接口的,那么就沒(méi)有句柄了,而是某個(gè)接口指針,IXXXPtr之類(lèi)的,比如Windows的com ptr。
類(lèi)不得繼承構(gòu)造方法,派生類(lèi)必須實(shí)現(xiàn)自己的構(gòu)造方法,只能通過(guò)顯示調(diào)用來(lái)使用基類(lèi)構(gòu)造方法
正則表達(dá)式使用時(shí)需要引用相應(yīng)的命名空間:using System.Text.RegularExpressions;
重寫(xiě)ToString方法:默認(rèn)返回對(duì)象的hashcode,重寫(xiě)的話(huà)可以顯示用戶(hù)需要的顯示效果。返回人員能夠看得懂的內(nèi)容。
for循環(huán)中的參數(shù)用分號(hào);進(jìn)行分隔如: for (int i = 1; i <= 5; i++)
執(zhí)行順序:對(duì)于單個(gè)的類(lèi),它的靜態(tài)構(gòu)造函數(shù)將先于普通構(gòu)造函數(shù)執(zhí)行。靜態(tài)構(gòu)造函數(shù)只能執(zhí)行一次。
基類(lèi)構(gòu)造函數(shù)的執(zhí)行要早于子類(lèi)構(gòu)造函數(shù)。基類(lèi)構(gòu)造函數(shù)中對(duì)于虛方法的調(diào)用,實(shí)際調(diào)用的是子類(lèi)中重寫(xiě)的虛方法。
我們?cè)诔跏蓟粋€(gè)對(duì)象時(shí),總是會(huì)先執(zhí)行基類(lèi)的構(gòu)造函數(shù),然后再執(zhí)行子類(lèi)的構(gòu)造函數(shù)。
異常的類(lèi)型有: System.DivideByZeroException 、System.ArithmeticException 、Exception e 、e.ToString()打印出錯(cuò)誤的信息
C# 文件主體Main M大寫(xiě),C++/Java中是小寫(xiě)的
/// XML類(lèi)型注釋
我們不要在非封閉類(lèi)型的構(gòu)造函數(shù)內(nèi)調(diào)用虛方法或虛屬性
命名空間: System.Text.RegularExpressions 處理正則表達(dá)式類(lèi)型
命名空間:System.Data 數(shù)據(jù)庫(kù)相關(guān)
Console.read()只讀一個(gè)字符,返回該字符的ascII碼
Console.read()輸入類(lèi)型需要為int類(lèi)型
Console.readline()讀一行字符,ReadLine()是讀取一行,返回值是string類(lèi)型
list特殊狀態(tài)的數(shù)組,list.add, list.count,list.sort,list.reverse
在子類(lèi)中重寫(xiě)方法,new需要放在類(lèi)型之前 new bool DoSomething
靜態(tài)構(gòu)造函數(shù)是一個(gè)特殊的構(gòu)造函數(shù),它在該類(lèi)型的所有成員(包括實(shí)例構(gòu)造函數(shù))第一次被訪問(wèn)之前執(zhí)行
而與實(shí)例的初始化器會(huì)在實(shí)例構(gòu)造函數(shù)之前執(zhí)行類(lèi)似,靜態(tài)初始化器會(huì)在靜態(tài)構(gòu)造函數(shù)之前執(zhí)行
string.compare(,,[true]) 比較兩者是否相同(忽略大小寫(xiě))
string.concat(a,b)合并兩個(gè)字符串
string.conpy(a) 拷貝 a
s.indexof('somestring',[],[])
s.insert(序號(hào),‘somestring’)
C#語(yǔ)言是編譯型語(yǔ)言,但其“編譯”過(guò)程比較特殊,具體說(shuō)明如下:
C#程序在第一次運(yùn)行的時(shí)候,會(huì)依賴(lài)其.NET Frameworker平臺(tái),編譯成IL中間碼),然后由JIT compiler翻譯成本地的機(jī)器碼執(zhí)行。從第二次在運(yùn)行相同的程序,則不需要再執(zhí)行以上編譯和翻譯過(guò)程,而是直接運(yùn)行第一次翻譯成的機(jī)器碼。所以對(duì)于C#來(lái)說(shuō),通常第一次運(yùn)行時(shí)間會(huì)很長(zhǎng),但從第二次開(kāi)始,程序的執(zhí)行時(shí)間會(huì)快很多。
字符串是不可變的,如果需要改變,則需要重新賦值。
類(lèi)如果沒(méi)有顯示定義構(gòu)造器,系統(tǒng)會(huì)生成一個(gè)默認(rèn)構(gòu)造器
C# string 和 stringbuilder的區(qū)別:
String 對(duì)象是不可改變的。每次使用 String 類(lèi)中的方法之一或進(jìn)行運(yùn)算時(shí)(如賦值、拼接等)時(shí),都要在內(nèi)存中創(chuàng)建一個(gè)新的字符串對(duì)象,這就需要為該新對(duì)象分配新的空間。而 StringBuilder 則不會(huì),在需要對(duì)字符串執(zhí)行重復(fù)修改的情況下,與創(chuàng)建新的 String 對(duì)象相關(guān)的系統(tǒng)開(kāi)銷(xiāo)可能會(huì)非常昂貴。如果要修改字符串而不創(chuàng)建新的對(duì)象,則可以使用 System.Text.StringBuilder 類(lèi);例如,當(dāng)在一個(gè)循環(huán)中將許多字符串連接在一起時(shí),使用 StringBuilder 類(lèi)可以提升性能。
值類(lèi)型與引用類(lèi)型:值類(lèi)型存儲(chǔ)的數(shù)據(jù)本身,引用類(lèi)型存儲(chǔ)的是對(duì)數(shù)據(jù)存儲(chǔ)位置的引用
引用類(lèi)型不像值類(lèi)型那樣要求創(chuàng)建數(shù)據(jù)的內(nèi)存副本,所以賦值引用類(lèi)型的實(shí)例比復(fù)制值類(lèi)型的實(shí)例更加高效。
string[] languages = new string[3]{“hello”,"world","你好!" } 指定數(shù)組大小
int[,] cells = int[2,3]
Getlength()是獲得數(shù)組長(zhǎng)度的方法
System.Array.Reverse(temp)
const為靜態(tài)常量編譯期確定,static readonly為動(dòng)態(tài)常量運(yùn)行時(shí)確定。
異常處理的代價(jià)很高,需要調(diào)用系統(tǒng)底層的資源
可空修飾符 int? name = null
空接合操作符:expression1 ?? expression2 如果1為空,則使用2的值
C# 不支持布爾隱式轉(zhuǎn)換成數(shù)字
字段只有類(lèi)的實(shí)例可以訪問(wèn),類(lèi)不可以直接訪問(wèn)(靜態(tài)類(lèi)除外)
所有類(lèi)型都能夠隱式轉(zhuǎn)換為object類(lèi)型