日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 人文社科 > 生活经验 >内容正文

生活经验

The key of C# 学习笔记I-II

發(fā)布時(shí)間:2023/11/27 生活经验 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 The key of C# 学习笔记I-II 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
作者 :Kemin's booootLog? http://blog.csdn.net/keminlau/

Sunday, October 3, 2004

    1. 微軟提出的CLS(Common Language Specification, 通用語(yǔ)言標(biāo)準(zhǔn))對(duì)能被用來(lái)編寫(xiě)dotNET程序的語(yǔ)言的最小功能集做出了規(guī)定。
    2. 就拿C#來(lái)說(shuō),它是目前程序設(shè)計(jì)語(yǔ)言“以效率換安全”發(fā)展潮流的一個(gè)產(chǎn)物。
    3. “編譯器”把整個(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í)行。
    4. 傳統(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ù)用性”。
    5. 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)。
    6. 一個(gè)“操作符”(Operater)就是一個(gè)將使計(jì)算機(jī)執(zhí)行某一個(gè)特定操作的符號(hào)或者單詞;
    7. 在C#及其他很多現(xiàn)代程序設(shè)計(jì)語(yǔ)言里,程序代碼都必須寫(xiě)成稱(chēng)為“類(lèi)”和“方法”的單元。
    8. 最簡(jiǎn)單的C#程序僅包含一個(gè)類(lèi),這個(gè)類(lèi)又僅包含一個(gè)方法---》Main()入口函數(shù)。
    9. 一個(gè)方法聲明將由一個(gè)修飾符(such as static),一個(gè)返回值類(lèi)型(such as void),一個(gè)方法名稱(chēng),一個(gè)括在一對(duì)圓括號(hào)的輸入?yún)?shù)列表,一個(gè)包含著該方法代碼主體的語(yǔ)句塊等組成.
    10. 一個(gè)方法就是一組用來(lái)完成某項(xiàng)特定任務(wù)的程序代碼.
    11. 一個(gè)表達(dá)式可以是一個(gè)變量、一個(gè)常量或者是一個(gè)操作的執(zhí)行或計(jì)算結(jié)果。
    12. 當(dāng)C#對(duì)兩個(gè)整數(shù)做除法運(yùn)算時(shí),它會(huì)把結(jié)果“截短”。幸好有求余(%)彌補(bǔ)。

Tuesday, October 5,2004

  1. 表達(dá)式(expression)是由操作數(shù)(operand)和操作符(operater)構(gòu)成。一個(gè)表達(dá)式有他的值,因此表達(dá)式可以作另一個(gè)表達(dá)式的操作數(shù)。
  2. C家族重要特征之一,精練,少打字。“復(fù)合賦值”操作符:+=加等;-+減等;++遞增;--遞減;……
  3. C#編譯器的特殊功能:出現(xiàn)在類(lèi)、方法或者其他程序結(jié)構(gòu)元素的前面且以三個(gè)斜線“///”開(kāi)頭的注釋允許包含XML標(biāo)記。C#編譯器將生成一個(gè)XML文件來(lái)存放這些標(biāo)記。
  4. 在如今的數(shù)字計(jì)算機(jī)里,各種信息都將編碼為一系列“比特”;比特是信息最簡(jiǎn)單的表示形式。計(jì)算機(jī)硬件用電壓的高低或者有無(wú)來(lái)表示一比特;
  5. 現(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ì)量單位。
  6. C#使用32比特(4個(gè)字節(jié))來(lái)表示一個(gè)int類(lèi)型的變量。一個(gè)int可以用來(lái)存儲(chǔ)正數(shù)和負(fù)數(shù),所以int正式定義是“32比特的帶符號(hào)整數(shù)”。
  7. 二進(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
  8. 現(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
  9. C#關(guān)鍵字checked and unchecked激活溢出檢查機(jī)制
  10. 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é)約空間
  11. 字段和方法的相似之處是它們都是某個(gè)類(lèi)或者某個(gè)結(jié)構(gòu)的成員,但字段要簡(jiǎn)單得多。一個(gè)字段其實(shí)就是一個(gè)變量或者一個(gè)取值固定不變的常數(shù)。

?

Thursday, October 7, 2004

  1. 在一條涉及多種運(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)型。
  2. 方法重載(overload)就是一個(gè)方法的多種不同版本。如Console.WriteLine()方法的方法簽名(即輸入?yún)?shù))可以是整數(shù)也可以是字符串。
  3. 同樣,操作符重載是指用同一個(gè)操作符完成不同類(lèi)型的操作的做法。如加號(hào)“+”用作數(shù)值加法和字符串合并。
  4. C#里的“字符串里的引號(hào)”問(wèn)題:
    1. 用轉(zhuǎn)義字符改變字符的正常含義如:string StringWithQuotes = "The name of the composition is/"Appalachian Spring./"";
    2. 用"@"關(guān)提掉轉(zhuǎn)義如: string Directory = @"C:/Program files/Key of c#";
  5. 程序在內(nèi)存中分布(清楚存放部位)
    1. 代碼區(qū):存放程序的代碼,程序的各個(gè)函數(shù)代碼塊;
    2. 全局?jǐn)?shù)據(jù)區(qū):存放程序的全局?jǐn)?shù)據(jù)和靜態(tài)數(shù)據(jù);
    3. 堆區(qū):存放程序的動(dòng)態(tài)數(shù)據(jù);
    4. 棧區(qū):存放程序的局部數(shù)據(jù),可以說(shuō)是函數(shù)中的數(shù)據(jù);
    5. 特別的是棧區(qū)的數(shù)據(jù),函數(shù)結(jié)束就會(huì)釋放.
  6. C#里的“引用”不是C/C++里的“指針”,它是安全的“引用指針”,與C/C++“指針”完成類(lèi)似的操作。引用類(lèi)型數(shù)據(jù)(如類(lèi))的具體數(shù)據(jù)內(nèi)容被保存在從里分配的某個(gè)內(nèi)存塊中,而這個(gè)內(nèi)存塊的引用指針則保存在堆棧上。
  7. 從內(nèi)存分配來(lái)理解null空串的區(qū)別:
    1. 保留字null是一個(gè)取值為0的引用指針,這意味著C#不會(huì)多堆里分配內(nèi)存。一個(gè)沒(méi)用引用任何堆內(nèi)存的字符串變量叫作一個(gè)“null字符串”。
    2. 當(dāng)某個(gè)字符串變量被賦值為null時(shí),C#不會(huì)從堆里為它分配任何內(nèi)存且堆棧上與它對(duì)應(yīng)的值是0;
    3. 當(dāng)某個(gè)字符串變量等于空字符串時(shí),C#會(huì)從堆里為它分配一些內(nèi)存,但字符串長(zhǎng)度為0
  8. 文本是人與計(jì)算機(jī)進(jìn)行交流的主要媒介。人們“強(qiáng)迫”計(jì)算機(jī)顯示文本輸出和接受文本輸入。即便是在只顯示數(shù)值的場(chǎng)合,計(jì)算機(jī)也必須把各有關(guān)的有關(guān)數(shù)值的二進(jìn)制表示形式轉(zhuǎn)換為相應(yīng)的文本輸出形式。
  9. int與string互轉(zhuǎn):
    1. ToString是一個(gè)實(shí)例(instance)方法: string str = 123.ToString();//存在實(shí)例
    2. Int32.Parse是一個(gè)靜態(tài)(static)方法: int i = Int32.Parse("123");//創(chuàng)建實(shí)例
  10. 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);
  11. C#兩種非整形數(shù)據(jù)類(lèi)型:浮點(diǎn)數(shù)decimal
    1. 浮點(diǎn)數(shù)很常用,但有著一個(gè)先天的不足,就是精度不夠(float七位有效數(shù)字,double有15或16位)
    2. 對(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

  1. decimal舍入
    1. “四舍五入”:
      Decimal.Truncate(Value);//向零方向舍入
      Decimal.Floor(Value);//向負(fù)無(wú)窮方向舍入
    2. “舍入為偶數(shù)”:
      Decimal.Round(Value,Digits);//Round(3.345,2) = 3.34
  2. 格式字符串
    Consloe.WriteLine("{0,20:X5}{1,10:C2}",str1,str2);//{占位,輸出寬度:格式}
  3. 保留字“static”表明該方法為靜態(tài)方法,將作用于類(lèi)或結(jié)構(gòu)而不是作用于類(lèi)或結(jié)構(gòu)中的某個(gè)特定的方法,它必須與類(lèi)或結(jié)構(gòu)的名字配合使用,如Console.WriteLine();
  4. 字段就是在一個(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。
  5. new保留字的角色和作用:
    new表達(dá)式的返回值是一個(gè)引用(指針),它指系統(tǒng)從堆分配的那個(gè)內(nèi)存塊。如:int[] aiArray = new int[]
  6. 進(jìn)一步理解new的作用:明確給對(duì)象在堆里分配空間
    1. Random rand;//rand沒(méi)被初始化,什么都不做
    2. rand = new Random();//為rand從堆分配內(nèi)存和初始化操作等
  7. C#不允許你用保留字const去聲明一個(gè)數(shù)組——只有在編譯階段被確定或計(jì)算出來(lái)的值才能被聲明為常數(shù);數(shù)組需要一個(gè)new操作,而new操作只有等到運(yùn)行階段才會(huì)發(fā)生。
  8. 程序?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字段。
  9. .NET的Random類(lèi)供程序員用來(lái)從從那顆隨機(jī)種子開(kāi)始生成隨機(jī)數(shù)。

Monday, October 11, 2004

  1. 邏輯公式--德·莫干定律:
    1. !( A | B ) = !A & !B?
    2. !(?A & B?) = !A | !B
  2. 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。
  3. 所有的程序設(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ù)值。
  4. String.Chars 屬性
    在 C# 中,該屬性為 String 類(lèi)的索引器。獲取此實(shí)例中位于指定字符位置的字符。
  5. 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

  1. 浮點(diǎn)數(shù)的比較運(yùn)算
    1. 對(duì)浮點(diǎn)數(shù)進(jìn)行比較,必須先舍入為相同精度再進(jìn)行,因其的不精確性。
    2. 在需要測(cè)試某個(gè)float值或double值是否為無(wú)窮大或NaN時(shí),不能直接用Single或Double結(jié)構(gòu)中的PositiveInfinity、NegativeInfinity或NaN字段進(jìn)行比較;應(yīng)選用IsInfinity等方法來(lái)完成,因其有二義。
  2. 建議最好不要用“==”操作符去比較兩個(gè)布爾值,因?yàn)椴恍⌒纳俅蛞粋€(gè)等號(hào),會(huì)致命的。可以使用異或操作符“^”將更穩(wěn)妥。異或操作等價(jià)于“!=”操作符,所以有不少人把“^”稱(chēng)為邏輯“不等于”操作符。只要用“^”操作符對(duì)“!=”操作的結(jié)果再進(jìn)行一次邏輯非處理,就能得到與“==”操作符同樣的效果,如:
    1. bWeAreCompatible = bYouLikeMahler == bILikeMahler
    2. bWeAreCompatible = !(bYouLikeMahler?^ bILikeMahler)
  3. 局部變量只在對(duì)它做出了聲明的那個(gè){語(yǔ)句塊}里才是可見(jiàn)的。這個(gè)語(yǔ)句塊有多大,求證中....
  4. C#沒(méi)有“else語(yǔ)句”之類(lèi)的東東,C#中的if語(yǔ)句由一個(gè)if部分和一個(gè)可選的else部分構(gòu)成。C#也沒(méi)有“else if語(yǔ)句”,是兩條if組合在一起而矣。
  5. 條件操作符
    1. 條件與(&&)與條件或(||)
      1. bExpression1 && bExpression2//如果bExpression1被求值為false,bExpression2將不會(huì)被求值
      2. bExpression1 || bExpression2//如果bExpression1被求值為true,bExpression2將不會(huì)被求值
    2. 古怪“條件表達(dá)式”(?:),唯一三目操作符。
  6. ??? 一、C#的異常處理所用到關(guān)鍵字

    1. ???? try 用于檢查發(fā)生的異常,并幫助發(fā)送任何可能的異常。

    2. ???? catch 以控制權(quán)更大的方式處理錯(cuò)誤,可以有多個(gè)catch子句。

    3. ???? finally 無(wú)論是否引發(fā)了異常,finally的代碼塊都將被執(zhí)行。

    1. ???? throw 用于引發(fā)異常,可引發(fā)預(yù)定義異常和自定義異常。
  7. ??? 二、C#異常處理的格式

    以下是引用片段:
    try
    {
    ??程序代碼塊;
    }
    catch(Exception?e)
    {
    ???異常處理代碼塊;
    }
    finally
    {
    ???無(wú)論是否發(fā)生異常,均要執(zhí)行的代碼塊;
    }

  8. 有效的調(diào)試技巧
    沒(méi)有漏網(wǎng)的魚(yú) "This statement should never be executed."

  9. 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

  1. 算法“Sieve of Eratosthences”(Eratosthences之篩)是一種用來(lái)生成素?cái)?shù)的算法。素?cái)?shù)是只能被1和它本身整除的整數(shù)。2是第一個(gè)素?cái)?shù),也是素?cái)?shù)中惟一的一個(gè)偶數(shù)。
  2. CPU耗時(shí)比較:方法調(diào)用 > 乘除運(yùn)算 > 加減運(yùn)算
  3. 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;
    }


  4. 與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;
    ....

  5. 編寫(xiě)C#程序的“基本工具”:
    1. 聲明語(yǔ)句;
    2. 賦值語(yǔ)句;
    3. 選擇語(yǔ)句(if, switch);//它們使程序能夠根據(jù)一個(gè)比較操作或者其他布爾操作的結(jié)果有選擇地改變執(zhí)行路線
    4. 循環(huán)語(yǔ)句(while, do, for, foreach);//它們使程序能夠反復(fù)多次地執(zhí)行同一組語(yǔ)句。
    5. 跳轉(zhuǎn)語(yǔ)句(return, break, continue, throw, goto);//它們使程序能夠從一個(gè)地方跳轉(zhuǎn)到另一個(gè)地方去繼續(xù)執(zhí)行。
  6. 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)位;否則,使用“>>”操作符。
  7. 枚舉器
    枚舉器即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

  1. C#方法調(diào)用傳遞的參數(shù)分四類(lèi):
    1. 默認(rèn)的值參數(shù)(value parameter); //傳遞復(fù)制品
    2. 引用參數(shù)(reference parameter),關(guān)鍵字"ref";//傳遞引用指針
    3. 輸出參數(shù)(output parameter),關(guān)鍵字"out"。//方法返回一個(gè)以上的返回值時(shí)使用
    4. 數(shù)組參數(shù)(array parameter),關(guān)鍵字"params"
  2. 引用參數(shù)輸出參數(shù)的區(qū)別:
    “引用參數(shù)”與“輸出參數(shù)”非常相似。out修飾符ref修飾符有很相似的地方:傳址。事實(shí)上保留字“ref”和“out”本身在中間語(yǔ)言里的實(shí)現(xiàn)是一模一樣的。但C#中的ref參數(shù)與out參數(shù)還是有區(qū)別的:
    1. ref參數(shù)必須在進(jìn)入方法之前得到賦值;
    2. 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);
          }
      }

  3. 數(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ī)定:
    1. 數(shù)組參數(shù)只能是一維的;
    2. 如果有多個(gè)輸入?yún)?shù),就只允許一個(gè)輸入?yún)?shù)是params參數(shù),而且它必須是參數(shù)表中的最后一個(gè)


Tuesday, October 19, 2004

  1. 數(shù)據(jù)的封裝-對(duì)象
    1. 從本質(zhì)上講,對(duì)象就是數(shù)據(jù)。隨著程序設(shè)計(jì)語(yǔ)言的發(fā)展,當(dāng)人們開(kāi)始把不同的數(shù)據(jù)組合在一起并當(dāng)作一個(gè)整體事物來(lái)對(duì)待時(shí),“對(duì)象”出世了!(拿日期對(duì)象作理解)
    2. 在聲明變量和常數(shù)時(shí),你的程序其實(shí)就是在創(chuàng)建對(duì)象,數(shù)值常數(shù)和字符串都是對(duì)象。不過(guò),有你的程序真正執(zhí)行有關(guān)語(yǔ)句之前,對(duì)象是不會(huì)“出生的”。
    3. 日期對(duì)象:日期是由三個(gè)分立的數(shù)型變量組合而成的有機(jī)整體,這樣會(huì)大大簡(jiǎn)化對(duì)日期數(shù)據(jù)的處理。
  2. new操作符將為新實(shí)例分配內(nèi)存并把它的的各個(gè)字段全部初始化為0;堆內(nèi)永遠(yuǎn)是被初始化為的0的(就是堆棧可是值0或空指針null)。
  3. Date[] aDate = new Date[5];
    1. 如果Date是一個(gè)結(jié)構(gòu):這條語(yǔ)句將從堆里為這個(gè)結(jié)構(gòu)的5個(gè)實(shí)例(無(wú)需new初始化了,叫實(shí)例了嘛)分配內(nèi)存并把各元素的所有字段全部初始化為0;
    2. 如果是一個(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();
  4. C#數(shù)組是一個(gè)引用類(lèi)型,數(shù)組中的各個(gè)元素將存儲(chǔ)在堆里。如 int[] ai?= new int[12];//使用new關(guān)鍵字在heap分配內(nèi)存
  5. 除了數(shù)組,C#還有以下引用類(lèi)型:

    ?
  6. 堆棧的執(zhí)行效率要比堆的執(zhí)行效率高,可是堆棧的資源有限,不適合處理大的邏輯復(fù)雜的對(duì)象。所以結(jié)構(gòu)處理作為基類(lèi)型對(duì)待的小對(duì)象,而類(lèi)處理某個(gè)商業(yè)邏輯
  7. 雖然結(jié)構(gòu)的初始化也使用了new 操作符,可是結(jié)構(gòu)對(duì)象依然分配在堆棧上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段將保持未賦值狀態(tài),且對(duì)象不可用
  8. 如何選擇結(jié)構(gòu)還是類(lèi)
    討論了結(jié)構(gòu)與類(lèi)的相同之處和差別之后,下面討論如何選擇使用結(jié)構(gòu)還是類(lèi):
    1. 堆棧的空間有限,對(duì)于大量的邏輯的對(duì)象,創(chuàng)建類(lèi)要比創(chuàng)建結(jié)構(gòu)好一些
    2. 結(jié)構(gòu)表示如點(diǎn)、矩形和顏色這樣的輕量對(duì)象,例如,如果聲明一個(gè)含有 1000 個(gè)點(diǎn)對(duì)象的數(shù)組,則將為引用每個(gè)對(duì)象分配附加的內(nèi)存。在此情況下,結(jié)構(gòu)的成本較低。
    3. 表現(xiàn)抽象多級(jí)別對(duì)象層次時(shí),類(lèi)是最好的選擇
    4. 大多數(shù)情況下該類(lèi)型只是一些數(shù)據(jù)時(shí),結(jié)構(gòu)時(shí)最佳的選擇
  9. 面向過(guò)程到面向?qū)ο笕阶?#xff1a;
    1. 封裝對(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)型

    2. 封裝與對(duì)象有關(guān)的方法到類(lèi)(或結(jié)構(gòu))內(nèi)部中去,成為類(lèi)(或結(jié)構(gòu))的行為,進(jìn)一步共享代碼
    3. 區(qū)分類(lèi)(或結(jié)構(gòu))方法和字段的靜態(tài)性和實(shí)例性,進(jìn)一步簡(jiǎn)化使用對(duì)象的代碼
  10. .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)的。
  11. 若一個(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)取代

  12. 關(guān)鍵字"virtual"和"override"是密切相關(guān)的:如果A類(lèi)繼承B類(lèi),就可以在A類(lèi)里用一個(gè)override(重寫(xiě))方法覆蓋掉B類(lèi)里的同名的virtual方法。

  13. 不使用"override"關(guān)鍵字也能覆蓋一個(gè)方法,但這種做法只有新、老方法的簽名和訪問(wèn)性完全一致的情況下才能達(dá)到目的


?

Wednesday, October 20, 2004

  1. 類(lèi)的字段初始化方法:
    1. 在聲明語(yǔ)句里直接初始化:

      class Date{
      ??? public int iYear = 2004;
      ??? public int iMonth = 10;
      ??? public int iDay = 20;
      ??? .......
      }

    2. 使用構(gòu)造器:

      class Date{
      ??? public int iYear, iMonth, iMonth;?
      ???
      ??? public Date(){//無(wú)參數(shù)構(gòu)造器
      ??????? iYear = 1;
      ??????? iMonth = 1;
      ??????? iDay = 1;
      ???
      }
      ??? .......
      }

    3. 為了加快那些基于結(jié)構(gòu)的數(shù)組創(chuàng)建速度,結(jié)構(gòu)均不支持以上兩種初始化結(jié)構(gòu)的方法。
  2. 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í)例外。
  3. C#的結(jié)構(gòu)結(jié)論:
    1. 結(jié)構(gòu)的定義是封閉的(不能作為基類(lèi)使用);
    2. 結(jié)構(gòu)隱式地派生自System.ValueType,而System.ValueType是所有值類(lèi)型的超類(lèi)型(終極基類(lèi))。
    3. 結(jié)構(gòu)沒(méi)有默認(rèn)的構(gòu)造器
  4. 阻止創(chuàng)建類(lèi)實(shí)例的方法:一個(gè)私有的(private)空白無(wú)參數(shù)構(gòu)造器,如:class clsA{...private clsA(){}...}
  5. 實(shí)際上如果我們能夠深刻地把握類(lèi)的構(gòu)造器的唯一目的就是保證類(lèi)內(nèi)的成員變量能夠得到正確的初始化,我們對(duì)各種C#中形形色色的構(gòu)造器便有會(huì)心的理解--它沒(méi)有理由不這樣!
  6. ? ⒈﹜ ┣━┒ ; `.┣─┒`  ..wǒ
      個(gè)ボ ┟━┃┍╄┓┟━│ ╃━  
     ? 人 ┝─┃┣╈┤┣━┃;/ ╈  
     ???  ┗━┘┗┸┛└━┛/┃┻
  7. 相等性:
    當(dāng)你自行創(chuàng)建一個(gè)類(lèi)或結(jié)構(gòu)時(shí),一定要對(duì)相等性概念多做些思考。
  8. 要想成為一名合格的程序員,不僅要知道類(lèi)對(duì)象和結(jié)構(gòu)對(duì)象在相等性、賦值操作、方法調(diào)用等幾個(gè)方面有何不同,還要了解new操作符對(duì)類(lèi)對(duì)象和結(jié)構(gòu)對(duì)象的處理有何不同。
    1. 要想創(chuàng)建出某個(gè)類(lèi)的一個(gè)實(shí)例,就必須使用一個(gè)new操作符,new操作符將進(jìn)行幾項(xiàng)非常重要的處理:
      1. 從堆里為新對(duì)象分配內(nèi)存;
      2. 有選擇地調(diào)用那個(gè)類(lèi)的某一個(gè)構(gòu)造器。
    2. 創(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)的。
  9. ?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

  1. 域的存取限制集中體現(xiàn)了面向?qū)ο缶幊痰?font color="red">封裝原則
  2. 只讀(readonly)域不能進(jìn)行寫(xiě)操作,不變常量(const)不能被修改,這兩者到底有什么區(qū)別呢?
    1. 只讀域只能在初始化--聲明初始化或構(gòu)造器初始化--的過(guò)程中賦值,其他地方不能進(jìn)行對(duì)只讀域的賦值操作,否則編譯器會(huì)報(bào)錯(cuò)。只讀域可以是實(shí)例域也可以是靜態(tài)域。只讀域的類(lèi)型可以是C#語(yǔ)言的任何類(lèi)型。
    2. 但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)型。
  3. 實(shí)際上,如果我們能夠理解const修飾的常量是在編譯時(shí)便被計(jì)算出確定的值,并代換到引用該常量的每一個(gè)地方,而readonly時(shí)在運(yùn)行時(shí)才確定的量--只是在初始化后我們不希望它的值再改變,我們便能理解C#設(shè)計(jì)者們的良苦用心,我們才能徹底把握const和readonly的行為!
  4. C#不提倡將域的保護(hù)級(jí)別設(shè)為public而使用戶(hù)在類(lèi)外任意操作--那樣太不OO,或者具體點(diǎn)說(shuō)太不安全!對(duì)所有有必要在類(lèi)外可見(jiàn)的域,C#推薦采用屬性來(lái)表達(dá)。屬性不表示存儲(chǔ)位置,這是屬性和域的根本性的區(qū)別。
  5. 繼承
    一個(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ò)展
  6. 繼承能力是類(lèi)和結(jié)構(gòu)的重要區(qū)別之一。結(jié)構(gòu)不支持繼承機(jī)制。
  7. 學(xué)海無(wú)涯,面向?qū)ο蟮某绦蛟O(shè)計(jì)既是一門(mén)科學(xué),也是一門(mén)藝術(shù),如果這本書(shū)能讓大家領(lǐng)略到它的一些奧妙,作者知足了!!
  8. 繼承與預(yù)構(gòu)造器(constructor initializer)
    1. 每一個(gè)構(gòu)造器都會(huì)用一個(gè)預(yù)構(gòu)造器
    2. 子類(lèi)不能繼承基類(lèi)的構(gòu)造器但是可以“拿來(lái)用”,用關(guān)鍵字“base”指定父類(lèi)和“this”指定本類(lèi)中的構(gòu)造器作為本構(gòu)造器的預(yù)構(gòu)造器。
    3. 在沒(méi)有指定時(shí),父類(lèi)的無(wú)參數(shù)構(gòu)構(gòu)造器為缺省的預(yù)構(gòu)造器,即:“base()”
  9. 訪問(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

  1. 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."
  2. polymorphism(破利摩飛神):“poly-”表示多之意,“-morph”,形態(tài)形狀
  3. 多態(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;
    ??? }
    }

  4. as 運(yùn)算符
    1. 用于執(zhí)行可兼容類(lèi)型之間的轉(zhuǎn)換。as 運(yùn)算符用在以下形式的表達(dá)式中:expression as type
    2. as 運(yùn)算符類(lèi)似于類(lèi)型轉(zhuǎn)換,所不同的是,當(dāng)轉(zhuǎn)換失敗時(shí),as 運(yùn)算符將產(chǎn)生空,而不是引發(fā)異常。
    3. 請(qǐng)注意,as 運(yùn)算符只執(zhí)行引用轉(zhuǎn)換和裝箱轉(zhuǎn)換。as 運(yùn)算符無(wú)法執(zhí)行其他轉(zhuǎn)換。
  5. is 運(yùn)算符用于檢查對(duì)象的運(yùn)行時(shí)類(lèi)型是否與給定類(lèi)型兼容。
  6. GetType()方法與操作符typeof()System.Type類(lèi)
    1. Type t = instance.GetType();//一個(gè)實(shí)例方法,返回一個(gè)Type對(duì)象
    2. Type t = typeof(class);//一個(gè)操作符,操作數(shù)為一種類(lèi)型非某一實(shí)例,也是返回一個(gè)Type對(duì)象
    3. 相等性比較:bool b = instance.GetType() == typeof(class);
  7. 所謂“實(shí)現(xiàn)一個(gè)接口”指的是把該接口所聲?? 明的方法都在某個(gè)類(lèi)里實(shí)現(xiàn)出來(lái)。
  8. 接口本質(zhì)上是類(lèi)需要如何響應(yīng)的定義。接口描述類(lèi)需要實(shí)現(xiàn)的方法、屬性和事件,以及每個(gè)成員需要接收和返回的參數(shù)類(lèi)型,但將這些成員的特定實(shí)現(xiàn)留給實(shí)現(xiàn)類(lèi)去完成。
  9. 派生類(lèi)可以重寫(xiě)(override)基類(lèi)里的虛(virtual)方法和屬性, 也可“隱藏”(new關(guān)鍵字)基類(lèi)里的非虛成員。
  10. 操作符重載:()
    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:

    1. 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...

    2. ?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ò),歡迎將生活随笔推薦給好友。