生活随笔
收集整理的這篇文章主要介紹了
The key of C# 学习笔记I-II
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
作者 :Kemin's booootLog? http://blog.csdn.net/keminlau/ Sunday, October 3, 2004
微軟提出的CLS(Common Language Specification, 通用語(yǔ)言標(biāo)準(zhǔn))對(duì)能被用來(lái)編寫(xiě)dotNET 程序的語(yǔ)言的最小功能集做出了規(guī)定。 就拿C#來(lái)說(shuō),它是目前程序設(shè)計(jì)語(yǔ)言“以效率換安全 ”發(fā)展潮流的一個(gè)產(chǎn)物。 “編譯器”把整個(gè)程序一次性地全部轉(zhuǎn)換為將被計(jì)算機(jī)執(zhí)行的機(jī)器代碼;機(jī)器碼形成一個(gè)“可執(zhí)行文件”,這個(gè)文件可以直接在計(jì)算機(jī)上運(yùn)行。但因?yàn)闄C(jī)器碼是與某特定計(jì)算機(jī)相關(guān)聯(lián),所以可執(zhí)行文件只能在特定的類(lèi)型的計(jì)算機(jī)上執(zhí)行。 傳統(tǒng)過(guò)程化程序設(shè)計(jì)語(yǔ)言(如C),數(shù)據(jù)將由過(guò)程(或者叫“函數(shù)”“子例程”)代碼進(jìn)行處理 ;在面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言里,程序員創(chuàng)建各種“類(lèi)”,并由此衍生出“對(duì)象”,一個(gè)對(duì)象就是代碼和數(shù)據(jù)的混合體,數(shù)據(jù)由對(duì)象自身進(jìn)行處理 。這種觀念大大提高了代碼的“復(fù)用性”。 20世紀(jì)90年代,SUN公司推出了Java ,這種面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言以C為藍(lán)本,但與C++ 有著顯著的區(qū)別 。JAVA摒棄了C++某些難看又難用的語(yǔ)法,也剔除了某些有危險(xiǎn)性的C語(yǔ)言功能,但它保留了C語(yǔ)言簡(jiǎn)潔緊湊的特點(diǎn)。 一個(gè)“操作符”( Operater)就是一個(gè)將使計(jì)算機(jī)執(zhí)行某一個(gè)特定操作的符號(hào)或者單詞; 在C#及其他很多現(xiàn)代程序設(shè)計(jì)語(yǔ)言里,程序代碼 都必須寫(xiě)成稱(chēng)為“類(lèi)”和“方法”的單元。 最簡(jiǎn)單的C#程序 僅包含一個(gè)類(lèi),這個(gè)類(lèi)又僅包含一個(gè)方法---》Main()入口函數(shù)。 一個(gè)方法聲明 將由一個(gè)修飾符(such as static),一個(gè)返回值類(lèi)型(such as void),一個(gè)方法名稱(chēng),一個(gè)括在一對(duì)圓括號(hào)的輸入?yún)?shù)列表,一個(gè)包含著該方法代碼主體的語(yǔ)句塊等組成. 一個(gè)方法 就是一組用來(lái)完成某項(xiàng)特定任務(wù)的程序代碼. 一個(gè)表達(dá)式 可以是一個(gè)變量、一個(gè)常量或者是一個(gè)操作的執(zhí)行或計(jì)算結(jié)果。 當(dāng)C#對(duì)兩個(gè)整數(shù)做除法運(yùn)算 時(shí),它會(huì)把結(jié)果“截短”。幸好有求余(%)彌補(bǔ)。
Tuesday, October 5,2004
表達(dá)式(expression) 是由操作數(shù)(operand)和操作符(operater)構(gòu)成。一個(gè)表達(dá)式有他的值,因此表達(dá)式可以作另一個(gè)表達(dá)式的操作數(shù)。 C家族 重要特征之一,精練,少打字。“復(fù)合賦值”操作符:+=加等;-+減等;++遞增;--遞減;…… C#編譯器的特殊功能 :出現(xiàn)在類(lèi)、方法或者其他程序結(jié)構(gòu)元素的前面且以三個(gè)斜線“///”開(kāi)頭的注釋允許包含XML標(biāo)記。C#編譯器將生成一個(gè)XML文件來(lái)存放這些標(biāo)記。 在如今的數(shù)字計(jì)算機(jī)里,各種信息都將編碼為一系列“比特” ;比特是信息最簡(jiǎn)單的表示形式。計(jì)算機(jī)硬件用電壓的高低或者有無(wú)來(lái)表示一比特; 現(xiàn)今的個(gè)人電腦大都是32位計(jì)算機(jī),這是因?yàn)樗鼈円?2比特作為對(duì)數(shù)據(jù)進(jìn)行存儲(chǔ)和處理的基本單位。早期的計(jì)算機(jī)每次只能處理8個(gè)比特,人們把8個(gè)比特稱(chēng)為一個(gè)字節(jié) 。即使到了今天,字節(jié)仍是計(jì)算機(jī)領(lǐng)域最常用計(jì)量單位。 C#使用32比特(4個(gè)字節(jié))來(lái)表示一個(gè)int類(lèi)型的變量。一個(gè)int可以用來(lái)存儲(chǔ)正數(shù)和負(fù)數(shù),所以int正式定義是“32比特的帶符號(hào)整數(shù)”。 二進(jìn)制數(shù)是以2的冪次來(lái)表示的,2的N次冪就是一個(gè)二進(jìn)制數(shù)字1后面跟上N個(gè)0所構(gòu)成的一個(gè)二進(jìn)制數(shù)。如:1-0000-0000等于256或28 現(xiàn)代的數(shù)字計(jì)算機(jī)里,負(fù)數(shù)通常被表示成“二進(jìn)制補(bǔ)碼” 。二進(jìn)制補(bǔ)碼指的是一種用來(lái)對(duì)正數(shù)和負(fù)數(shù)進(jìn)行轉(zhuǎn)換的方法。如要表示-7(假設(shè)只有4個(gè)比特,頭一位為符號(hào)位):先得7的二進(jìn)制表示:0111,再把0111按取反加一得“補(bǔ)碼”1001,1001即-7 C#關(guān)鍵字checked and unchecked激活溢出檢查機(jī)制 C#支持8種整型數(shù)據(jù);選用整型數(shù)據(jù)的基本原則: @97%優(yōu)先考慮使用int類(lèi)型,32位便于處理也更有效率 @數(shù)值比int大,才選用long @如果需要使用磁盤(pán)文件來(lái)存儲(chǔ)或檢索大量小整數(shù),考慮選用shot,byte 節(jié)約空間 字段和方法的相似之處是它們都是某個(gè)類(lèi)或者某個(gè)結(jié)構(gòu)的成員,但字段要簡(jiǎn)單得多。一個(gè)字段其實(shí)就是一個(gè)變量或者一個(gè)取值固定不變的常數(shù)。
?
Thursday, October 7, 2004
在一條涉及多種運(yùn)算的復(fù)雜語(yǔ)句里,C#將根據(jù)操作符的優(yōu)先級(jí)和運(yùn)算規(guī)則依次對(duì)各有關(guān)操作的操作數(shù)進(jìn)行必要的類(lèi)型轉(zhuǎn)換 (小容量向大容量轉(zhuǎn))。在賦值操作中,等號(hào)右邊的表達(dá)式將被隱含地轉(zhuǎn)換為等左邊的變量的類(lèi)型。 方法重載(overload) 就是一個(gè)方法的多種不同版本。如Console.WriteLine()方法的方法簽名(即輸入?yún)?shù))可以是整數(shù)也可以是字符串。 同樣,操作符重載 是指用同一個(gè)操作符完成不同類(lèi)型的操作的做法。如加號(hào)“+”用作數(shù)值加法和字符串合并。 C#里的“字符串里的引號(hào) ”問(wèn)題: 用轉(zhuǎn)義字符改變字符的正常含義如:string StringWithQuotes = "The name of the composition is/"Appalachian Spring./""; 用"@"關(guān)提掉轉(zhuǎn)義如: string Directory = @"C:/Program files/Key of c#"; 程序在內(nèi)存中分布 (清楚存放部位) 代碼區(qū):存放程序的代碼,程序的各個(gè)函數(shù)代碼塊; 全局?jǐn)?shù)據(jù)區(qū):存放程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù); 堆區(qū):存放程序的動(dòng)態(tài)數(shù)據(jù); 棧區(qū):存放程序的局部數(shù)據(jù),可以說(shuō)是函數(shù)中的數(shù)據(jù); 特別的是棧區(qū)的數(shù)據(jù),函數(shù)結(jié)束就會(huì)釋放. C#里的“引用” 不是C/C++里的“指針”,它是安全的“引用指針”,與C/C++“指針”完成類(lèi)似的操作。引用類(lèi)型數(shù)據(jù)(如類(lèi))的具體數(shù)據(jù)內(nèi)容被保存在從堆 里分配的某個(gè)內(nèi)存塊中,而這個(gè)內(nèi)存塊的引用指針則保存在堆棧上。 從內(nèi)存分配來(lái)理解null 和空串 的區(qū)別: 保留字null是一個(gè)取值為0的引用指針 ,這意味著C#不會(huì)多堆里分配內(nèi)存。一個(gè)沒(méi)用引用任何堆內(nèi)存的字符串變量叫作一個(gè)“null字符串”。 當(dāng)某個(gè)字符串變量被賦值為null時(shí),C#不會(huì)從堆里為它分配任何內(nèi)存且堆棧上與它對(duì)應(yīng)的值是0; 當(dāng)某個(gè)字符串變量等于空字符串時(shí),C#會(huì)從堆里為它分配一些內(nèi)存,但字符串長(zhǎng)度為0 。 文本是人與計(jì)算機(jī)進(jìn)行交流的主要媒介。人們“強(qiáng)迫”計(jì)算機(jī)顯示文本輸出和接受文本輸入。即便是在只顯示數(shù)值的場(chǎng)合,計(jì)算機(jī)也必須把各有關(guān)的有關(guān)數(shù)值的二進(jìn)制表示形式轉(zhuǎn)換為相應(yīng)的文本輸出形式。 int與string互轉(zhuǎn): ToString 是一個(gè)實(shí)例(instance)方法: string str = 123.ToString();//存在實(shí)例 Int32.Parse 是一個(gè)靜態(tài)(static)方法: int i = Int32.Parse("123");//創(chuàng)建實(shí)例 System名字空間還有一個(gè)很好用的Convert類(lèi) 。程序員可以利用Convert類(lèi)所提供的各種靜態(tài)方法對(duì)任意兩種數(shù)據(jù)類(lèi)型進(jìn)行類(lèi)型轉(zhuǎn)換。如: int i = Convert.ToInt32(str); string str = Convert.ToString(i); C#兩種非整形數(shù)據(jù)類(lèi)型:浮點(diǎn)數(shù) 和decimal 浮點(diǎn)數(shù)很常用,但有著一個(gè)先天的不足,就是精度不夠(float七位有效數(shù)字,double有15或16位) 對(duì)比于int和uint(32位),long和ulong(64位),decimal使用128位16個(gè)字節(jié)儲(chǔ)存數(shù)據(jù);其中用96位表示有效數(shù)字(29個(gè)),5位表小數(shù)點(diǎn)位置(0-28),一位作符號(hào)位,共102位余26位。
Saturday, October 9, 2004
decimal舍入 “四舍五入”: Decimal.Truncate(Value);//向零方向舍入 Decimal.Floor(Value);//向負(fù)無(wú)窮方向舍入 “舍入為偶數(shù)”: Decimal.Round(Value,Digits);//Round(3.345,2) = 3.34 格式字符串 Consloe.WriteLine("{0,20:X5}{1,10:C2}",str1,str2);//{占位,輸出寬度:格式} 保留字“static”表明該方法為靜態(tài)方法 ,將作用于類(lèi)或結(jié)構(gòu)而不是作用于類(lèi)或結(jié)構(gòu)中的某個(gè)特定的方法,它必須與類(lèi)或結(jié)構(gòu)的名字配合使用,如Console.WriteLine(); 字段 就是在一個(gè)類(lèi)的內(nèi)部,但在這個(gè)類(lèi)里的所有方法的外部所聲明的變量或者常數(shù)。如里字段只與這個(gè)類(lèi)關(guān)聯(lián)而不與類(lèi)的實(shí)例關(guān)聯(lián),聲明為靜態(tài)static。 new保留字 的角色和作用: new表達(dá)式的返回值是一個(gè)引用(指針),它指系統(tǒng)從堆分配的那個(gè)內(nèi)存塊。如:int[] aiArray = new int[] 進(jìn)一步理解new的作用 :明確給對(duì)象在堆里分配空間 Random rand;//rand沒(méi)被初始化,什么都不做 rand = new Random();//為rand從堆分配內(nèi)存和初始化操作等 C#不允許你用保留字const 去聲明一個(gè)數(shù)組——只有在編譯階段 被確定或計(jì)算出來(lái)的值才能被聲明為常數(shù) ;數(shù)組需要一個(gè)new操作,而new操作只有等到運(yùn)行階段 才會(huì)發(fā)生。 程序?qū)W一項(xiàng)基本原則 ——“把變量,不管是數(shù)組還是其它類(lèi)型的變量,盡可能聲明為局部變量”;可是當(dāng)需要在一個(gè)程序里頻繁調(diào)用某個(gè)方法而這個(gè)方法又要用到一個(gè)其元素都是些常數(shù)的數(shù)組時(shí),就應(yīng)該把那個(gè)數(shù)組搬到那個(gè)方法的外部并把它聲明為一個(gè)static字段。 .NET的Random類(lèi)供程序員用來(lái)從從那顆隨機(jī)種子開(kāi)始生成隨機(jī)數(shù)。
Monday, October 11, 2004
邏輯公式--德·莫干定律: !( A | B ) = !A & !B? !(?A & B?) = !A | !B C#中的char數(shù)據(jù)類(lèi)型:代表單個(gè)字符 在C#里,可以用一個(gè)字符array去創(chuàng)建一個(gè)字符串,也可以把一個(gè)字符串轉(zhuǎn)換為一個(gè)字符array,但把一個(gè)C#字符串說(shuō)成是一個(gè)字符array是不恰當(dāng)?shù)摹#有字符串?dāng)?shù)據(jù)類(lèi)型string。 所有的程序設(shè)計(jì)語(yǔ)言都是用數(shù)值來(lái)代表字符的,但C語(yǔ)言把char看作是一種與int,short和long沒(méi)有什么不同的數(shù)值類(lèi)型。在C里,char的寬度是8個(gè)比特且代表一個(gè)ASCII字符,但在C#里,char的寬度是16個(gè)比特且代表的是一個(gè)Unicode字符。C#里的char變量不是數(shù)值。 String.Chars 屬性 在 C# 中,該屬性為 String 類(lèi)的索引器。獲取此實(shí)例中位于指定字符位置的字符。 new構(gòu)造器的理解 如果要你創(chuàng)建一個(gè)由21個(gè)"@"字符構(gòu)成的字符串,你會(huì)怎么做? string str = "@@@@@@@@@@@@@@@@@@@@@";//老實(shí)型 string str = new string('@' , 21);//簡(jiǎn)單聰明
Wednesday, October 13, 2004
浮點(diǎn)數(shù)的比較運(yùn)算 對(duì)浮點(diǎn)數(shù)進(jìn)行比較,必須先舍入為相同精度再進(jìn)行,因其的不精確性。 在需要測(cè)試某個(gè)float值或double值是否為無(wú)窮大或NaN時(shí),不能直接用Single或Double結(jié)構(gòu)中的PositiveInfinity、NegativeInfinity或NaN字段進(jìn)行比較;應(yīng)選用IsInfinity等方法來(lái)完成,因其有二義。 建議最好不要用“==”操作符去比較兩個(gè)布爾值 ,因?yàn)椴恍⌒纳俅蛞粋€(gè)等號(hào),會(huì)致命的。可以使用異或操作符“^”將更穩(wěn)妥。異或操作等價(jià)于“!=”操作符,所以有不少人把“^”稱(chēng)為邏輯“不等于” 操作符。只要用“^”操作符對(duì)“!=”操作的結(jié)果再進(jìn)行一次邏輯非處理,就能得到與“==”操作符同樣的效果,如: bWeAreCompatible = bYouLikeMahler == bILikeMahler bWeAreCompatible = !(bYouLikeMahler?^ bILikeMahler) 局部變量只在對(duì)它做出了聲明的那個(gè){語(yǔ)句塊} 里才是可見(jiàn)的。這個(gè)語(yǔ)句塊有多大,求證中.... C#沒(méi)有“else語(yǔ)句”之類(lèi)的東東,C#中的if語(yǔ)句由一個(gè)if部分和一個(gè)可選的else部分 構(gòu)成。C#也沒(méi)有“else if語(yǔ)句”,是兩條if組合在一起而矣。 條件操作符 條件與 (&&)與條件或 (||) bExpression1 && bExpression2//如果bExpression1被求值為false,bExpression2將不會(huì)被求值 bExpression1 || bExpression2//如果bExpression1被求值為true,bExpression2將不會(huì)被求值 古怪“條件表達(dá)式 ”(?:),唯一三目操作符。 ??? 一、 C #的異常處理 所用到關(guān)鍵字
???? try 用于檢查發(fā)生的異常,并幫助發(fā)送任何可能的異常。
???? catch 以控制權(quán)更大的方式處理錯(cuò)誤,可以有多個(gè) catch 子句。
???? finally 無(wú)論是否引發(fā)了異常, finally 的代碼塊都將被執(zhí)行。
???? throw 用于引發(fā)異常,可引發(fā)預(yù)定義異常和自定義異常。 ??? 二、 C #異常處理的格式
以下是引用片段: try { ??程序代碼塊; } catch(Exception?e) { ???異常處理代碼塊; } finally { ???無(wú)論是否發(fā)生異常,均要執(zhí)行的代碼塊; }
有效的調(diào)試技巧 沒(méi)有漏網(wǎng)的魚(yú) "This statement should never be executed."
for語(yǔ)句以保留字"for"開(kāi)始,后面跟著一對(duì)圓括號(hào),括號(hào)里有三個(gè)用分號(hào)隔開(kāi)的表達(dá)式。注意,這是分號(hào) 在C#中惟一不被當(dāng)作一個(gè)語(yǔ)句分隔符 來(lái)對(duì)待的地方!這三個(gè)表達(dá)式分別叫作for循環(huán)的“初始化表達(dá)式 ”、“循環(huán)條件表達(dá)式 ”和“步長(zhǎng)表達(dá)式 ”。
?
Friday, October 15, 2004
算法“Sieve of Eratosthences”(Eratosthences之篩 )是一種用來(lái)生成素?cái)?shù) 的算法。素?cái)?shù)是只能被1和它本身整除的整數(shù)。2是第一個(gè)素?cái)?shù),也是素?cái)?shù)中惟一的一個(gè)偶數(shù)。 CPU耗時(shí) 比較:方法調(diào)用 > 乘除運(yùn)算 > 加減運(yùn)算 switch語(yǔ)句 在Java中,switch語(yǔ)句只能處理整數(shù)。但C#中的switch語(yǔ)句不同,它還能夠處理字符變量。 switch (args[0]) { ??? case "老板": ??????? Console.WriteLine("早上好!我們隨時(shí)準(zhǔn)備為您效勞!"); ??????? break; ??? case "雇員": ??????? Console.WriteLine("早上好!你可以開(kāi)始工作了!"); ??????? break; ????default: ????????Console.WriteLine("早上好!祝你好運(yùn)!"); ??????? break; }
與Java中的switch不同,C#的switch語(yǔ)句要求每一個(gè)case塊或者在塊的末尾提供一個(gè)break語(yǔ)句,或者用goto轉(zhuǎn)到switch內(nèi)的其他case標(biāo)簽。這就是所謂C#的“不允許留下swicth分支漏斗 ”的規(guī)定,不過(guò)你可以讓一個(gè)switch分支有多個(gè)switch標(biāo)號(hào) 。如: .... case "*"://多種乘法運(yùn)算符 case "x":// case "X":// ??? dResult = dNum1 * dNum2 ??? break; ....
編寫(xiě)C#程序 的“基本工具”: 聲明語(yǔ)句; 賦值語(yǔ)句; 選擇語(yǔ)句(if, switch);//它們使程序能夠根據(jù)一個(gè)比較操作或者其他布爾操作的結(jié)果有選擇地改變執(zhí)行路線 循環(huán)語(yǔ)句(while, do, for, foreach);//它們使程序能夠反復(fù)多次地執(zhí)行同一組語(yǔ)句。 跳轉(zhuǎn)語(yǔ)句(return, break, continue, throw, goto);//它們使程序能夠從一個(gè)地方跳轉(zhuǎn)到另一個(gè)地方去繼續(xù)執(zhí)行。 C#沒(méi)有>>>移位操作符 C#支持uint和ulong之類(lèi)的無(wú)符號(hào)變量類(lèi)型。因此,在C#中,右移操作符(即“>>”)對(duì)于無(wú)符號(hào)變量類(lèi)型和帶符號(hào)變量類(lèi)型(比如int和long)的處理方式不同。右移uint和ulong丟棄低位并把空出的高位設(shè)置為零;但對(duì)于int和long類(lèi)型的變量,“>>”操作符丟棄低位,同時(shí),只有當(dāng)變量值是正數(shù)時(shí),“>>”才把空出的高位設(shè)置成零;如果“>>”操作的是一個(gè)負(fù)數(shù),空出的高位被設(shè)置成為1。 Java中不存在無(wú)符號(hào)的變量類(lèi)型。因此,我們用“>>>”操作符在右移時(shí)引入負(fù)號(hào)位;否則,使用“>>”操作符。 枚舉器 枚舉器即enum類(lèi)型(Enumerator,或稱(chēng)為計(jì)數(shù)器),它是一個(gè)相關(guān)常量的集合。精確地說(shuō),enum類(lèi)型聲明為一組相關(guān)的符號(hào)常量定義了一個(gè)類(lèi)型名字。例如,你可以創(chuàng)建一個(gè)名為Fruit(水果)的枚舉器,把它作為一個(gè)變量值的類(lèi)型使用,從而把變量可能的取值范圍限制為枚舉器中出現(xiàn)的值。 public class Demo { ??public enum Fruit { ??????? Apple, Banana, Cherry, Durian ??} ??public void Process(Fruit fruit) { ??? switch (fruit) { ??????? case Fruit.Apple: ??????????? ... ?????????? ?break; ??????? case Fruit.Banana: ??????????? ... ??????????? break; ????????case Fruit.Cherry: ????????????... ??????????? break; ??????? case Fruit.Durian: ??????????? ... ??????????? break; ????} ? } }
?
?
Sunday, October 17, 2004
C#方法調(diào)用 傳遞的參數(shù) 分四類(lèi): 默認(rèn)的值參數(shù)(value parameter); //傳遞復(fù)制品 引用參數(shù)(reference parameter),關(guān)鍵字"ref ";//傳遞引用指針 輸出參數(shù)(output parameter),關(guān)鍵字"out "。//方法返回一個(gè)以上的返回值時(shí)使用 數(shù)組參數(shù)(array parameter),關(guān)鍵字"params " 引用參數(shù) 與輸出參數(shù) 的區(qū)別: “引用參數(shù)”與“輸出參數(shù)”非常相似。out 修飾符ref 修飾符有很相似的地方:傳址。事實(shí)上保留字“ref”和“out”本身在中間語(yǔ)言里的實(shí)現(xiàn)是一模一樣的。但C#中的ref參數(shù)與out參數(shù)還是有區(qū)別的: ref參數(shù)必須在進(jìn)入方法之前得到賦值; out參數(shù)則必須在離開(kāi)方法之前得到賦值。需要記住輸出參數(shù) 與通常的函數(shù)返回值 有一定的區(qū)別:函數(shù)返回值往往存在堆棧里,在返回時(shí)彈出;而輸出參數(shù)需要用戶(hù)預(yù)先制定存儲(chǔ)位置,也就是用戶(hù)需要提前聲明變量--當(dāng)然也可以初始化。 using System; class Test????//拆分姓名 { static void ResoluteName(string fullname,out string firstname,out string lastname) { string[] strArray=fullname.Split(new char[]{' '}); firstname=strArray[0]; lastname=strArray[1]; } public static void Main() { ? ??????????????? //string MyName="Cornfield Lee"; ??????????????? Console.WriteLine("Enter Your Name:"); ??????????????? string MyName = Console.ReadLine(); string MyFirstName,MyLastName;
ResoluteName(MyName,out MyFirstName,out MyLastName);
Console.WriteLine("My first name: {0}, My last name: {1}", ??????????????? MyFirstName, MyLastName); } }
數(shù)組參數(shù) (關(guān)鍵字"params ") using System; class Test??? //合計(jì)所有整數(shù)值 { static int Sum(params int[] args) { int s=0; foreach(int n in args) { s+=n; } return s; } static void Main() { int[] var=new int[]{1,2,3,4,5}; Console.WriteLine("The Sum:"+Sum(var));//傳數(shù)組變量 Console.WriteLine("The Sum:"+Sum(10,20,30,40,50));//傳能夠隱式轉(zhuǎn)化為數(shù)組的參數(shù) } }
注意以下兩個(gè)規(guī)定: 數(shù)組參數(shù)只能是一維 的; 如果有多個(gè)輸入?yún)?shù),就只允許一個(gè)輸入?yún)?shù)是params參數(shù),而且它必須是參數(shù)表中的最后一個(gè) 。
Tuesday, October 19, 2004
數(shù)據(jù)的封裝 -對(duì)象 從本質(zhì)上講,對(duì)象就是數(shù)據(jù)。隨著程序設(shè)計(jì)語(yǔ)言的發(fā)展,當(dāng)人們開(kāi)始把不同的數(shù)據(jù)組合在一起并當(dāng)作一個(gè)整體 事物來(lái)對(duì)待時(shí),“對(duì)象”出世 了!(拿日期對(duì)象作理解) 在聲明變量和常數(shù)時(shí),你的程序其實(shí)就是在創(chuàng)建對(duì)象,數(shù)值常數(shù)和字符串都是對(duì)象。不過(guò),有你的程序真正執(zhí)行有關(guān)語(yǔ)句之前,對(duì)象是不會(huì)“出生的”。 日期對(duì)象:日期是由三個(gè)分立的數(shù)型變量組合而成的有機(jī)整體,這樣會(huì)大大簡(jiǎn)化對(duì)日期數(shù)據(jù)的處理。 new操作符 將為新實(shí)例分配內(nèi)存 并把它的的各個(gè)字段全部初始化 為0;堆內(nèi)永遠(yuǎn)是被初始化為的0的(就是堆棧可是值0或空指針null)。 Date[] aDate = new Date[5]; 如果Date是一個(gè)結(jié)構(gòu) :這條語(yǔ)句將從堆里為這個(gè)結(jié)構(gòu)的5個(gè)實(shí)例(無(wú)需new初始化了,叫實(shí)例了嘛)分配內(nèi)存并把各元素的所有字段全部初始化為0; 如果是一個(gè)類(lèi) ,這條語(yǔ)句將只為這個(gè)數(shù)組本身分配內(nèi)存(上面也會(huì)為數(shù)組本身分本內(nèi)存,不過(guò)還為結(jié)構(gòu)實(shí)例分配)。這個(gè)數(shù)組的各個(gè)元素將是null。因?yàn)檫@個(gè)數(shù)組的各個(gè)元素都是一個(gè)引用(指針)。在使用這個(gè)數(shù)組的元素前,必須先用一個(gè)new構(gòu)造實(shí)例(包括分配內(nèi)存和初始化): aDate[3] = new Date(); C#數(shù)組是一個(gè)引用類(lèi)型 ,數(shù)組中的各個(gè)元素將存儲(chǔ)在堆里。如 int[] ai?= new int[12];//使用new關(guān)鍵字在heap分配內(nèi)存 除了數(shù)組,C#還有以下引用類(lèi)型: ? 堆棧的執(zhí)行效率要比堆的執(zhí)行效率高,可是堆棧的資源有限,不適合處理大的邏輯復(fù)雜的對(duì)象 。所以結(jié)構(gòu) 處理作為基類(lèi)型對(duì)待的小對(duì)象 ,而類(lèi) 處理某個(gè)商業(yè)邏輯 雖然結(jié)構(gòu) 的初始化也使用了new 操作符 ,可是結(jié)構(gòu)對(duì)象依然分配在堆棧上 而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段將保持未賦值狀態(tài),且對(duì)象不可用 如何選擇結(jié)構(gòu)還是類(lèi) 討論了結(jié)構(gòu)與類(lèi)的相同之處和差別之后,下面討論如何選擇使用結(jié)構(gòu)還是類(lèi): 堆棧的空間有限,對(duì)于大量的邏輯 的對(duì)象,創(chuàng)建類(lèi) 要比創(chuàng)建結(jié)構(gòu)好一些 結(jié)構(gòu) 表示如點(diǎn)、矩形和顏色這樣的輕量對(duì)象 ,例如,如果聲明一個(gè)含有 1000 個(gè)點(diǎn)對(duì)象的數(shù)組,則將為引用每個(gè)對(duì)象分配附加的內(nèi)存。在此情況下,結(jié)構(gòu)的成本較低。 在表現(xiàn)抽象 和多級(jí)別 的對(duì)象層次 時(shí),類(lèi) 是最好的選擇 大多數(shù)情況下該類(lèi)型只是一些數(shù)據(jù) 時(shí),結(jié)構(gòu) 時(shí)最佳的選擇 面向過(guò)程到面向?qū)ο笕阶?#xff1a; 封裝對(duì)象簡(jiǎn)化輸入?yún)?shù)列表: static int DayOfYear(int iYear, int iMonth, int iDay){....}//三個(gè) 整型輸入?yún)?shù)
static int DayOfYear(Date dDate){....}//Date就好像是一個(gè) 已預(yù)先定義好的簡(jiǎn)單類(lèi)型 。
封裝與對(duì)象有關(guān)的方法到類(lèi)(或結(jié)構(gòu))內(nèi)部中去,成為類(lèi)(或結(jié)構(gòu))的行為,進(jìn)一步共享代碼 : 區(qū)分類(lèi)(或結(jié)構(gòu))方法和字段的靜態(tài)性和實(shí)例性,進(jìn)一步簡(jiǎn)化使用 對(duì)象的代碼 。 .NET Framewrok里的每一個(gè)類(lèi)和每一個(gè)結(jié)構(gòu)ToString 方法,自已定義的類(lèi)和結(jié)構(gòu)也不例外,因?yàn)镃#里所有類(lèi)和結(jié)構(gòu)都繼承自同一個(gè)祖先——System.Object類(lèi)。雖然結(jié)構(gòu)不支持繼承,但是所有的結(jié)構(gòu)都是直接或間接從System.ValueType類(lèi)繼承而來(lái)的。 若一個(gè)實(shí)例方法的聲明中含有 virtual 修飾符,則稱(chēng)該方法為虛擬方法 。若其中沒(méi)有 virtual 修飾符,則稱(chēng)該方法為非虛擬方法。 非虛擬方法的實(shí)現(xiàn)是不會(huì)變 的:無(wú)論是在聲明它的類(lèi)的實(shí)例上調(diào)用該方法還是在派生類(lèi)的實(shí)例上調(diào)用,實(shí)現(xiàn)都是相同的。與此相反,一個(gè)虛擬方法的實(shí)現(xiàn)可以由派生類(lèi)取代 。
關(guān)鍵字"virtual"和"override "是密切相關(guān)的:如果A類(lèi)繼承B類(lèi),就可以在A類(lèi)里用一個(gè)override(重寫(xiě)) 方法覆蓋掉B類(lèi)里的同名的virtual方法。
不使用"override" 關(guān)鍵字也能覆蓋一個(gè)方法,但這種做法只有新、老方法的簽名和訪問(wèn)性完全一致的情況下才能達(dá)到目的
?
Wednesday, October 20, 2004
類(lèi)的字段初始化方法: 在聲明語(yǔ)句里直接初始化: class Date{ ??? public int iYear = 2004; ??? public int iMonth = 10; ??? public int iDay = 20; ??? ....... }
使用構(gòu)造器: class Date{ ??? public int iYear, iMonth, iMonth;? ??? ??? public Date(){//無(wú)參數(shù)構(gòu)造器 ??????? iYear = 1; ??????? iMonth = 1; ??????? iDay = 1; ??? } ??? ....... }
為了加快那些基于結(jié)構(gòu)的數(shù)組 的創(chuàng)建速度 ,結(jié)構(gòu)均不支持以上兩種初始化結(jié)構(gòu)的方法。 C#的結(jié)構(gòu)是一個(gè)關(guān)系重大的語(yǔ)言功能。和類(lèi)一樣,結(jié)構(gòu)也可以包含其他類(lèi)型。由于結(jié)構(gòu)在內(nèi)部是值類(lèi)型 的,所以結(jié)構(gòu)有時(shí)也被稱(chēng)為類(lèi)的輕型版本 。同時(shí),結(jié)構(gòu)不承擔(dān)引用對(duì)象所帶來(lái)的開(kāi)銷(xiāo),除非在對(duì)其裝箱時(shí)例外。 C#的結(jié)構(gòu)結(jié)論: 結(jié)構(gòu)的定義是封閉 的(不能作為基類(lèi)使用); 結(jié)構(gòu)隱式地派生自System.ValueType ,而System.ValueType是所有值類(lèi)型的超類(lèi)型(終極基類(lèi))。 結(jié)構(gòu)沒(méi)有默認(rèn)的構(gòu)造器 。 阻止創(chuàng)建 類(lèi)實(shí)例的方法:一個(gè)私有的(private)空白無(wú)參數(shù)構(gòu)造器,如:class clsA{...private clsA(){}...} 實(shí)際上如果我們能夠深刻地把握類(lèi)的構(gòu)造器的唯一目的 就是保證類(lèi)內(nèi)的成員變量能夠得到正確的初始化 ,我們對(duì)各種C#中形形色色的構(gòu)造器便有會(huì)心的理解--它沒(méi)有理由不這樣! ? ⒈﹜ ┣━┒ ; `.┣─┒` ..wǒ 個(gè)ボ ┟━┃┍╄┓┟━│ ╃━ ? 人 ┝─┃┣╈┤┣━┃;/ ╈ ??? ┗━┘┗┸┛└━┛/┃┻ 相等性: 當(dāng)你自行創(chuàng)建一個(gè)類(lèi)或結(jié)構(gòu)時(shí),一定要對(duì)相等性 概念多做些思考。 要想成為一名合格的程序員,不僅要知道類(lèi)對(duì)象和結(jié)構(gòu)對(duì)象在相等性、賦值操作、方法調(diào)用等幾個(gè)方面有何不同,還要了解new操作符 對(duì)類(lèi)對(duì)象和結(jié)構(gòu)對(duì)象的處理有何不同。 要想創(chuàng)建出某個(gè)類(lèi) 的一個(gè)實(shí)例,就必須使用一個(gè)new操作符,new操作符將進(jìn)行幾項(xiàng)非常重要的處理: 從堆里為新對(duì)象分配內(nèi)存; 有選擇地調(diào)用那個(gè)類(lèi)的某一個(gè)構(gòu)造器。 創(chuàng)建出某個(gè)結(jié)構(gòu)的一個(gè)實(shí)例,也使用一個(gè)new操作符,new操作符將調(diào)用結(jié)構(gòu)的惟一的無(wú)參數(shù)構(gòu)造器(不能重寫(xiě)),無(wú)參數(shù)構(gòu)造器只是 把所有的字段初始化0或null而已,其他什么都不做 。不允許字段非零和上面結(jié)構(gòu)創(chuàng)建速度有關(guān)的。 ?Reference Types versus Value Types
以下是引用片段: //?Reference?Type?(because?of?’class’) class??Ref?{?public?int?x,?y,?cx,?cy;?} //?Value?type?(because?of?’struct’) struct?Val?{?public?int?x,?y,?cx,?cy;?} static?void?SomeMethod?{ ???Ref?r1?=?new?Ref();??//?Allocated?in?heap ???Val?v1;??????????????//?Allocated?on?stack?(new?optional) ???r1.x?=?10;???????????//?Pointer?dereference ???v1.x?=?10;???????????//?Changed?on?stack ???RectRef?r2?=?r1;???? //?Copies?pointer?only ???RectVal?v2?=?v1;???? //?Allocate?on?stack?&?copies?members ???r1.x?=?20;???????????//?Changes?r1?and?r2 ???v1.x?=?20;???????????//?Changes?v1,?not?v2 }
?
Sunday, October 24, 2004
域的存取限制 集中體現(xiàn)了面向?qū)ο缶幊痰?font color="red">封裝原則 。 只讀(readonly) 域不能進(jìn)行寫(xiě)操作,不變常量(const) 不能被修改,這兩者到底有什么區(qū)別呢? 只讀域只能在初始化--聲明初始化或構(gòu)造器初始化--的過(guò)程中賦值,其他地方不能進(jìn)行對(duì)只讀域的賦值操作,否則編譯器會(huì)報(bào)錯(cuò)。只讀域可以是實(shí)例域也可以是靜態(tài)域。只讀域的類(lèi)型可以是C#語(yǔ)言的任何類(lèi)型。 但const修飾的常量必須在聲明的同時(shí)賦值,而且要求編譯器能夠在編譯時(shí)期計(jì)算出這個(gè)確定的值。const修飾的常量為靜態(tài)變量,不能夠?yàn)閷?duì)象所獲取。const修飾的值的類(lèi)型也有限制,它只能為下列類(lèi)型之一(或能夠轉(zhuǎn)換為下列類(lèi)型的):sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, bool, string, enum類(lèi)型, 或引用類(lèi)型。能夠聲明為const的引用類(lèi)型只能為string或值為null的其他引用類(lèi)型。 實(shí)際上,如果我們能夠理解const修飾的常量是在編譯時(shí)便被計(jì)算出確定的值,并代換到引用該常量的每一個(gè)地方 ,而readonly時(shí)在運(yùn)行時(shí)才確定的量 --只是在初始化后我們不希望它的值再改變,我們便能理解C#設(shè)計(jì)者們的良苦用心,我們才能徹底把握const和readonly的行為! C#不提倡將域的保護(hù)級(jí)別設(shè)為public而使用戶(hù)在類(lèi)外任意操作--那樣太不OO,或者具體點(diǎn)說(shuō)太不安全!對(duì)所有有必要在類(lèi)外可見(jiàn)的域,C#推薦采用屬性來(lái)表達(dá)。屬性不表示存儲(chǔ)位置 ,這是屬性和域的根本性的區(qū)別。 繼承 : 一個(gè)現(xiàn)有的類(lèi)(基類(lèi))派生出一個(gè)新類(lèi)(子類(lèi))時(shí),子類(lèi)將自動(dòng)獲得所有被聲明在基類(lèi)的非private方法、屬性和字段(注意基類(lèi)的構(gòu)造器是不會(huì)被繼承的。)。子類(lèi)可以通過(guò)增加或者替換它繼承到的各種方法、屬性和字段的方式對(duì)基類(lèi)的功能進(jìn)行擴(kuò)展 。 繼承能力是類(lèi)和結(jié)構(gòu)的重要區(qū)別之一。結(jié)構(gòu)不支持繼承機(jī)制。 學(xué)海無(wú)涯,面向?qū)ο蟮某绦蛟O(shè)計(jì)既是一門(mén)科學(xué),也是一門(mén)藝術(shù) ,如果這本書(shū)能讓大家領(lǐng)略到它的一些奧妙 ,作者知足了!! 繼承與預(yù)構(gòu)造器 (constructor initializer) 每一個(gè)構(gòu)造器都會(huì)用一個(gè)預(yù)構(gòu)造器 子類(lèi)不能繼承基類(lèi)的構(gòu)造器但是可以“拿來(lái)用”,用關(guān)鍵字“base”指定父類(lèi)和“this”指定本類(lèi)中的構(gòu)造器作為本構(gòu)造器的預(yù)構(gòu)造器。 在沒(méi)有指定時(shí),父類(lèi)的無(wú)參數(shù)構(gòu)構(gòu)造器為缺省的預(yù)構(gòu)造器,即:“base()” 訪問(wèn)限定符理解: 很多新手認(rèn)為代碼共享就是最大限度的開(kāi)放自己的代碼,總是不假思索把所有東西都聲明為“public”,其實(shí)類(lèi)里面的public成員應(yīng)該越少越好,因?yàn)榭梢?font color="red">降低調(diào)試難道 ,還遵循“盡量掩藏?cái)?shù)據(jù)。使類(lèi)成為一個(gè)代碼黑箱 ”的原則。
Monday, October 25, 2004
One of the more powerful concepts in object-oriented programming is polymorphism . The roots of this word, "poly-" and "-morph" mean, when put together, "many forms." polymorphism(破利摩飛神 ):“poly-”表示多之意,“-morph”,形態(tài)形狀 多態(tài)實(shí)例: using System ; public class DrawingBase{ ??? public virtual void Draw(){//基類(lèi)虛方法 ??????? Console.WriteLine("I'm just a generic drawing object."); ????} } public class Line : DrawingBase{ ??? public override void Draw( ){//子類(lèi)重寫(xiě)虛方法1 ??????? Console.WriteLine("I'm a Line."); ??? } } public class Circle : DrawingBase{ ??? public override void Draw( ){//子類(lèi)重寫(xiě)虛方法2 ??????? Console.WriteLine("I'm a Circle."); ??? } } public class Square : DrawingBase{ ??? public override void Draw( ){//子類(lèi)重寫(xiě)虛方法3 ??????? Console.WriteLine("I'm a Square."); ??? } } public class DrawDemo{ ??? public static int Main(string[] args){ ??????? DrawingBase [] dObj = new DrawingBase [4];//創(chuàng)建基類(lèi)類(lèi)型數(shù)組 ??????? dObj[0] = new Line( );//賦值類(lèi)型向上轉(zhuǎn)換 ??????? dObj[1] = new Circle( );//聲明(編譯時(shí))為基類(lèi)類(lèi)型,實(shí)際類(lèi)型(運(yùn)行時(shí))為子類(lèi)類(lèi)型 ??????? dObj[2] = new Square( ); ??????? dObj[3] = new DrawingBase( ); ??????? foreach (DrawingBase drawObj in dObj) ??????????? drawObj.Draw( );//運(yùn)行時(shí)“后綁定”各個(gè)Draw版本 ??????? return 0; ??? } }
as 運(yùn)算符 用于執(zhí)行可兼容類(lèi)型之間的轉(zhuǎn)換。as 運(yùn)算符用在以下形式的表達(dá)式中:expression as type as 運(yùn)算符類(lèi)似于類(lèi)型轉(zhuǎn)換,所不同的是,當(dāng)轉(zhuǎn)換失敗時(shí),as 運(yùn)算符將產(chǎn)生空,而不是引發(fā)異常。 請(qǐng)注意,as 運(yùn)算符只執(zhí)行引用轉(zhuǎn)換和裝箱轉(zhuǎn)換。as 運(yùn)算符無(wú)法執(zhí)行其他轉(zhuǎn)換。 is 運(yùn)算 符用于檢查對(duì)象的運(yùn)行時(shí)類(lèi)型是否與給定類(lèi)型兼容。 GetType() 方法與操作符typeof() 和System.Type 類(lèi) Type t = instance.GetType();//一個(gè)實(shí)例方法,返回一個(gè)Type對(duì)象 Type t = typeof(class);//一個(gè)操作符,操作數(shù)為一種類(lèi)型非某一實(shí)例,也是返回一個(gè)Type對(duì)象 相等性比較:bool b = instance.GetType() == typeof(class); 所謂“實(shí)現(xiàn)一個(gè)接口 ”指的是把該接口所聲?? 明的方法都在某個(gè)類(lèi)里實(shí)現(xiàn)出來(lái)。 接口本質(zhì)上是類(lèi)需要如何響應(yīng)的定義。接口描述類(lèi)需要實(shí)現(xiàn)的方法、屬性和事件,以及每個(gè)成員需要接收和返回的參數(shù)類(lèi)型,但將這些成員的特定實(shí)現(xiàn)留給實(shí)現(xiàn)類(lèi)去完成。 派生類(lèi)可以重寫(xiě)(override)基類(lèi)里的虛(virtual)方法和屬性, 也可“隱藏”(new關(guān)鍵字)基類(lèi)里的非虛成員。 操作符重載:() Operators are defined for the built-in types, but that's not all. ? You can add operators to your own types , allowing them to be used much like the operators with the built-in C# types. Requirement:you create a Matrix type and then do a mathematical operation with them.
Solution:
implement an Add() , DotProduct() , and other methods to get the job done. Matrix result = mat1.Add(mat2);? // instance or Matrix result = Matrix.Add(mat1, mat2);? // static or event worse Matrix result = mat1.DotProduct(mat2).DotProduct(mat3); // and so on...
?much easier to have a + operator for the add operation and a * operator for the dot product operation. Matrix result = mat1 + mat2; or
Matrix result = mat1 * mat2; or even better
Matrix result = mat1 * mat2 * mat3 * mat4;
總結(jié)
以上是生活随笔 為你收集整理的The key of C# 学习笔记I-II 的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔 網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔 推薦給好友。