直播中
1, 結(jié)構(gòu)(struct) 與 類(lèi)(class)
[attributes] [modifiers] struct identifier [:interfaces] body [;]
結(jié)構(gòu)與類(lèi)很相似,都表示可以包含數(shù)據(jù)成員和函數(shù)成員的數(shù)據(jù)結(jié)構(gòu)。與類(lèi)不同的是,結(jié)構(gòu)是值類(lèi)型并且不需要堆分配。結(jié)構(gòu)類(lèi)型的變量直接包含結(jié)構(gòu)的數(shù)據(jù),而類(lèi)類(lèi)型的變量包含對(duì)數(shù)據(jù)的引用(該變量稱(chēng)為對(duì)象)。 struct 類(lèi)型適合表示如點(diǎn)、矩形和顏色這樣的輕量對(duì)象。盡管可能將一個(gè)點(diǎn)表示為類(lèi),但結(jié)構(gòu)在某些方案中更有效。在一些情況下,結(jié)構(gòu)的成本較低。例如,如果聲明一個(gè)含有 1000 個(gè)點(diǎn)對(duì)象的數(shù)組,則將為引用每個(gè)對(duì)象分配附加的內(nèi)存。結(jié)構(gòu)可以聲明構(gòu)造函數(shù),但它們必須帶參數(shù)。聲明結(jié)構(gòu)的默認(rèn)(無(wú)參數(shù))構(gòu)造函數(shù)是錯(cuò)誤的??偸翘峁┠J(rèn)構(gòu)造函數(shù)以將結(jié)構(gòu)成員初始化為它們的默認(rèn)值。在結(jié)構(gòu)中初始化實(shí)例字段是錯(cuò)誤的。在類(lèi)中,必須初始化實(shí)例對(duì)象. 使用 new 運(yùn)算符創(chuàng)建結(jié)構(gòu)對(duì)象時(shí),將創(chuàng)建該結(jié)構(gòu)對(duì)象,并且調(diào)用適當(dāng)?shù)臉?gòu)造函數(shù)。與類(lèi)不同的是,結(jié)構(gòu)的實(shí)例化可以不使用 new 運(yùn)算符。如果不使用 new,那么在初始化所有字段之前,字段將保持未賦值狀態(tài)且對(duì)象不可用。對(duì)于結(jié)構(gòu),不像類(lèi)那樣存在繼承。一個(gè)結(jié)構(gòu)不能從另一個(gè)結(jié)構(gòu)或類(lèi)繼承,而且不能作為一個(gè)類(lèi)的基。但是,結(jié)構(gòu)從基類(lèi) Object 繼承。結(jié)構(gòu)可實(shí)現(xiàn)接口,其方式同類(lèi)完全一樣。
[c++] 與 C++ 不同,無(wú)法使用 struct 關(guān)鍵字聲明類(lèi)。在 C# 中,類(lèi)與結(jié)構(gòu)在語(yǔ)義上是不同的。結(jié)構(gòu)是值類(lèi)型,而類(lèi)是引用類(lèi)型。
2, 裝箱和拆箱(取消裝箱)
裝箱是值類(lèi)型到 object 類(lèi)型或到該值類(lèi)型所實(shí)現(xiàn)的任何接口類(lèi)型的隱式轉(zhuǎn)換。將一個(gè)值的值裝箱會(huì)分配一個(gè)對(duì)象實(shí)例并將該值復(fù)制到新的對(duì)象中。關(guān)鍵字 object. 取消裝箱是從 object 類(lèi)型到值類(lèi)型或從接口類(lèi)型到實(shí)現(xiàn)該接口的值類(lèi)型的顯式轉(zhuǎn)換。取消裝箱操作包括:檢查對(duì)象實(shí)例,確保它是給定值類(lèi)型的一個(gè)裝箱值。將該值從實(shí)例復(fù)制到值類(lèi)型變量中。
例:
int i = 123; // A value type
object box = i; // Boxing
int j = (int)box; // Unboxing
裝箱轉(zhuǎn)換
取消裝箱
3 , 隱式和顯式
下列轉(zhuǎn)換屬于隱式轉(zhuǎn)換:例:object o=i;
標(biāo)識(shí)轉(zhuǎn)換。
隱式數(shù)值轉(zhuǎn)換。
隱式枚舉轉(zhuǎn)換。
隱式引用轉(zhuǎn)換。
裝箱轉(zhuǎn)換。
隱式常數(shù)表達(dá)式轉(zhuǎn)換。
用戶定義的隱式轉(zhuǎn)換。
下列轉(zhuǎn)換屬于顯式轉(zhuǎn)換: object 0=(object)i;
所有隱式轉(zhuǎn)換。
顯式數(shù)值轉(zhuǎn)換。
顯式枚舉轉(zhuǎn)換。
顯式引用轉(zhuǎn)換。
顯式接口轉(zhuǎn)換。
取消裝箱轉(zhuǎn)換。
用戶定義的顯式轉(zhuǎn)換
4, delegate(委托)
delegate void D(int x);
class C{
public static void M1(int i) { /* ... */ }
public static void M2(int i) { /* ... */ }}
class{…….D cd1 = new D(C.M1);………….}
委托是一個(gè)數(shù)據(jù)結(jié)構(gòu),該數(shù)據(jù)結(jié)構(gòu)引用一個(gè)靜態(tài)方法,或引用一個(gè)對(duì)象實(shí)例和該對(duì)象的實(shí)例方法。在 C 或 C++ 中與委托最接近的是函數(shù)指針,但函數(shù)指針只能引用靜態(tài)函數(shù),而委托可以同時(shí)引用靜態(tài)方法和實(shí)例方法。在后一種情況中,委托不僅存儲(chǔ)對(duì)方法入口點(diǎn)的引用,還存儲(chǔ)對(duì)調(diào)用其方法的對(duì)象的引用。與 C++ 函數(shù)指針不同,委托是完全面對(duì)對(duì)象的;與指向成員函數(shù)的 C++ 指針不同,委托同時(shí)封裝對(duì)象實(shí)例和方法。委托聲明定義從類(lèi) System.Delegate 派生的類(lèi)。委托實(shí)例封裝一個(gè)或多個(gè)方法,每個(gè)方法都被稱(chēng)為可調(diào)用實(shí)體。對(duì)于實(shí)例方法,可調(diào)用實(shí)體由一個(gè)實(shí)例和該實(shí)例上的方法組成。對(duì)于靜態(tài)方法,可調(diào)用實(shí)體僅由一個(gè)方法組成。給定委托實(shí)例和適當(dāng)?shù)膮?shù)集,便可以用該參數(shù)集調(diào)用此委托實(shí)例的所有方法。委托實(shí)例的一個(gè)有趣和有用的屬性是它不了解或不關(guān)心它所封裝的方法的類(lèi);真正重要的只是方法要與委托的類(lèi)型兼容, 這使委托非常適合“匿名”調(diào)用??蛇x的形參表指定委托的參數(shù),而返回類(lèi)型則指示委托的返回類(lèi)型。如果下面兩個(gè)條件都為真,則方法和委托類(lèi)型是兼容的:(兼容的概念就是可以用此聲明的委托對(duì)方法進(jìn)行委托).
1它們具有相同的參數(shù)數(shù)目,并且類(lèi)型相同,順序相同,參數(shù)修飾符也相同。
2它們的返回類(lèi)型相同。
C# 中的委托類(lèi)型是名稱(chēng)等效的,而不是結(jié)構(gòu)等效的。(但是請(qǐng)注意:兩個(gè)不同但結(jié)構(gòu)上等效的委托類(lèi)型的實(shí)例可能會(huì)比較為相等),準(zhǔn)確地說(shuō),兩個(gè)具有相同參數(shù)列表、簽名和返回類(lèi)型的不同的委托類(lèi)型被認(rèn)為是不同的委托類(lèi)型。委托實(shí)例所封裝的方法集合稱(chēng)為調(diào)用列表。
5, interface(接口)
[attributes] [modifiers] interface identifier [:base-list] {interface-body}[;]
一個(gè)接口定義一個(gè)協(xié)定。實(shí)現(xiàn)接口的類(lèi)或結(jié)構(gòu)必須遵守其協(xié)定。接口可以從多個(gè)基接口繼承,而類(lèi)或結(jié)構(gòu)可以實(shí)現(xiàn)多個(gè)接口。接口可以包含方法、屬性、事件和索引器。接口本身不提供它所定義的成員的實(shí)現(xiàn)。接口只指定實(shí)現(xiàn)該接口的類(lèi)或接口必須提供的成員。接口可以是命名空間或類(lèi)的成員,并且可以包含下列成員的簽名:方法屬性 索引器.
一個(gè)接口可從一個(gè)或多個(gè)基接口繼承。接口可由類(lèi)實(shí)現(xiàn)。實(shí)現(xiàn)的接口的標(biāo)識(shí)符出現(xiàn)在類(lèi)的基列表中。被繼承的接口稱(chēng)為該接口的顯式基接口。當(dāng)接口具有一個(gè)或多個(gè)顯式基接口時(shí),在該接口聲明中,接口標(biāo)識(shí)符后跟一個(gè)冒號(hào)以及由逗號(hào)分隔的基接口標(biāo)識(shí)符列表。接口的基接口是顯式基接口及其基接口。換言之,基接口集是顯式基接口、它們的顯式基接口(依此類(lèi)推)的完全可傳遞的閉包。接口繼承其基接口的所有成員。接口成員是通過(guò) I.M 和 I[A] 形式的成員訪問(wèn)和索引訪問(wèn)表達(dá)式訪問(wèn)的,其中 I 是接口類(lèi)型的實(shí)例,M 是該接口類(lèi)型的方法、屬性或事件,A 是索引器參數(shù)列表。接口可以由類(lèi)和結(jié)構(gòu)實(shí)現(xiàn)。為了指示類(lèi)或結(jié)構(gòu)實(shí)現(xiàn)接口,在該類(lèi)或結(jié)構(gòu)的基類(lèi)列表中包含了接口標(biāo)識(shí)符。在實(shí)現(xiàn)類(lèi)或結(jié)構(gòu)中定位接口成員的實(shí)現(xiàn)的過(guò)程稱(chēng)為接口映射。
6,object
object 類(lèi)類(lèi)型是所有其他類(lèi)型的最終基類(lèi)。C# 中的每種類(lèi)型都是直接或間接從 object 類(lèi)類(lèi)型派生的??梢园讶魏晤?lèi)型的數(shù)值給object類(lèi)型.
7,string類(lèi)型
string 類(lèi)的實(shí)例表示 Unicode 字符串。盡管 string 是引用類(lèi)型,但相等運(yùn)算符(== 和 !=)被定義為比較 string 對(duì)象(而不是引用)的“值”(7.9.7 字符串相等運(yùn)算符)。這使得對(duì)字符串相等性的測(cè)試更為直觀。字符串為 string 類(lèi)型并可寫(xiě)成兩種形式,即用引號(hào)引起來(lái)和用 @ 引起來(lái)。用引號(hào)引起來(lái)的字符串括在雙引號(hào) (") 內(nèi), 并且可以包含包括換碼序列在內(nèi)的任何字符用 @ 引起來(lái)的字符串以 @ 開(kāi)頭,并用雙引號(hào)引起來(lái)。用 @ 引起來(lái)的字符串以 @ 開(kāi)頭,并用雙引號(hào)引起來(lái)。若要在一個(gè)用 @ 引起來(lái)的字符串中包括一個(gè)雙引號(hào),請(qǐng)使用兩對(duì)雙引號(hào):@ 符號(hào)的另一種用法是使用碰巧成為 C# 關(guān)鍵字的被引用的 (/reference) 標(biāo)識(shí)符。
8, 修飾符
修飾符作用
訪問(wèn)修飾符
public
private
internal
protected
指定聲明的類(lèi)型和類(lèi)型成員的可訪問(wèn)性。
訪問(wèn)不受限制
只有包含該類(lèi)的成員的類(lèi)可以訪問(wèn)
只有當(dāng)前工程可以訪問(wèn)
只有包含該成員的類(lèi)和繼承的類(lèi)可以訪問(wèn)
abstract指示某個(gè)類(lèi)只能是其他類(lèi)的基類(lèi)。
const指定無(wú)法修改字段或局部變量的值。
event聲明一個(gè)事件。
extern指示外部實(shí)現(xiàn)此方法。
override提供從基類(lèi)繼承的虛擬成員的新實(shí)現(xiàn)。
readonly聲明一個(gè)字段,該字段只能賦值為該聲明的一部分或者在同一類(lèi)的構(gòu)造函數(shù)中。
sealed指定類(lèi)不能被繼承。
static聲明屬于類(lèi)型本身而不是屬于特定對(duì)象的成員。
unsafe聲明不安全的上下文。
virtual在派生類(lèi)中聲明其實(shí)現(xiàn)可由重寫(xiě)成員更改的方法或訪問(wèn)器。
volatile指示字段可由操作系統(tǒng)、硬件或并發(fā)執(zhí)行的線程等在程序中進(jìn)行修改。
9,語(yǔ)句
語(yǔ)句是程序指令。除非特別說(shuō)明,語(yǔ)句都按順序執(zhí)行。C# 具有下列類(lèi)別的語(yǔ)句。
類(lèi)別C# 關(guān)鍵字
選擇語(yǔ)句if, else, switch, case
迭代語(yǔ)句do, for, foreach, in, while
跳轉(zhuǎn)語(yǔ)句break, continue, default, goto, return
異常處理語(yǔ)句throw, try-catch, try-finally
Checked 和 Uncheckedchecked, unchecked
fixed 語(yǔ)句Fixed
lock 語(yǔ)句Lock
(1) foreach 語(yǔ)句為數(shù)組或?qū)ο蠹现械拿總€(gè)元素重復(fù)一個(gè)嵌入語(yǔ)句組。foreach 語(yǔ)句用于循環(huán)訪問(wèn)集合以獲取所需信息,但不應(yīng)用于更改集合內(nèi)容以避免產(chǎn)生不可預(yù)知的副作用。此語(yǔ)句的形式如下:
foreach (type identifier in expression) statement
若要循環(huán)訪問(wèn)集合,集合必須滿足特定的要求。集合類(lèi)型:
必須是 interface、class 或 struct。
必須包括返回類(lèi)型的名為 GetEnumerator 的實(shí)例方法,例如 Enumerator(詳見(jiàn)下文)。
Enumerator 類(lèi)型(類(lèi)或結(jié)構(gòu))必須包含:
一個(gè)名為 Current 的屬性,它返回 ItemType 或者可以轉(zhuǎn)換為此類(lèi)型的類(lèi)型。屬性訪問(wèn)器返回集合的當(dāng)前元素。
· 一個(gè)名為 MoveNext 的 bool 方法,它遞增項(xiàng)計(jì)數(shù)器并在集合中存在更多項(xiàng)時(shí)返回 true。
有三種使用集合的方法:
使用上述指導(dǎo)創(chuàng)建一個(gè)集合。此集合只能用于 C# 程序。
1. 使用上述指導(dǎo)創(chuàng)建一個(gè)一般集合,另外實(shí)現(xiàn) IEnumerable 接口。此集合可用于其他語(yǔ)言(如 Visual Basic)。
2. 在集合類(lèi)中使用一個(gè)預(yù)定義的集合。
(2) throw 語(yǔ)句用于發(fā)出在程序執(zhí)行期間出現(xiàn)反常情況(異常)的信號(hào)。throw 語(yǔ)句的形式為:
throw [expression];
expression :異常對(duì)象。當(dāng)在 catch 子句中再次引發(fā)當(dāng)前異常對(duì)象時(shí),它被省略。
(3)try –catch語(yǔ)句
try-catch 語(yǔ)句由一個(gè) try 塊和其后所跟的一個(gè)或多個(gè) catch 子句(為不同的異常指定處理程序)構(gòu)成。try-catch 語(yǔ)句采用下列形式之一:
try try-block
catch (exception-declaration-1) catch-block-1
catch (exception-declaration-2) catch-block-2
...
try try-block catch catch-block
(4) fixed
防止變量被垃圾回收器重定位。
(5) lock
lock 關(guān)鍵字將某個(gè)語(yǔ)句塊標(biāo)記為臨界區(qū)。
6. 方法參數(shù)
如果為沒(méi)有 ref 或 out 的方法聲明一個(gè)參數(shù),則此參數(shù)可以具有關(guān)聯(lián)的值??梢栽诜椒ㄖ懈脑撝?,但當(dāng)控制傳遞回調(diào)用過(guò)程時(shí),不會(huì)保留更改的值。通過(guò)使用方法參數(shù)關(guān)鍵字,可以更改這種行為。如果沒(méi)有ref,out則默認(rèn)為值傳遞,雖然可以在方法中修改這個(gè)參數(shù)的值,但是修改后的值不會(huì)還會(huì)到調(diào)用該方法的程序中.
params :params 關(guān)鍵字可以指定在參數(shù)數(shù)目可變處采用參數(shù)的方法參數(shù)
ref :引用傳遞
out :
7, namespace(名字空間)
write by cash(天下第七)
2002.01.20
版權(quán)所有,翻錄不究
選擇
我身上攜帶著精神、信仰、靈魂
思想、欲望、怪癖、邪念、狐臭
它們寄生于我身體的家
我必須平等對(duì)待我的每一位客人
-----------伊沙:《原則》
我的名字是cash,所以我很功利主義;
我的星像是Leo,所以我很大男人主義;
我的語(yǔ)言是C#,所以我有點(diǎn)兒拿不定主義。
/* 你能看得出來(lái),這不是一篇正規(guī)的技術(shù)文章,所以若你不小心從里邊讀到了一個(gè)愛(ài)情故事,可不要奇怪。有很多人用程序來(lái)表述愛(ài)情,在其中我能看到有Money,有Girl,有一些還涉及到Sex,但是我沒(méi)有找到Love,我始終相信這世上有一種力量直接來(lái)自于愛(ài)情,到現(xiàn)在仍然相信。*/
C#(讀作C sharp),是Microsoft公司新推出的(?)專(zhuān)為.NET設(shè)計(jì)的一門(mén)語(yǔ)言,號(hào)稱(chēng)“C/C++家族中第一種面向組件的語(yǔ)言”。很多人覺(jué)得它應(yīng)該像C或者C++,但事實(shí)上它更像是java的一個(gè)clone,所以作為入門(mén),讀一下清華大學(xué)出版社出版的《Java 語(yǔ)言與面向?qū)ο蟪绦蛟O(shè)計(jì)》可能會(huì)對(duì)你有所幫助。本文假定你具備一切學(xué)習(xí)此語(yǔ)言所需的知識(shí),沒(méi)有也不要緊,我會(huì)在文中盡量列出相關(guān)的link,鑒于互聯(lián)網(wǎng)瞬息萬(wàn)變的特點(diǎn),若某一鏈接不可用,請(qǐng)自行至Google查詢(xún)。
如前所述,我是一個(gè)獅子座男人,一度我認(rèn)為學(xué)習(xí)Java會(huì)使我看起來(lái)與眾不同,可是幾個(gè)月以后我放棄了這個(gè)選擇,我看了論壇里關(guān)于這兩種語(yǔ)言孰優(yōu)孰劣的討論,最終選擇了C#,請(qǐng)不要問(wèn)我為何做出這樣的選擇,很多人認(rèn)為中文是世界上最美麗的語(yǔ)言,可是華人世界以外有誰(shuí)在講漢語(yǔ)? 另外我發(fā)現(xiàn)論壇上學(xué)習(xí)Java的人都非常的有個(gè)性,當(dāng)有人問(wèn)起學(xué)習(xí)哪種語(yǔ)言更好時(shí),他會(huì)打出幾百個(gè)“JAVA”來(lái),填滿整個(gè)屏幕,也不說(shuō)是為了什么。我覺(jué)得這樣做未免有些太霸道了,如果你說(shuō)這叫偏執(zhí)狂我也不反對(duì),雖然我是獅子座,可也不想被人這樣看。
在C#剛剛推出的時(shí)候,大多數(shù)的程序員都不免吼上兩句——不是因?yàn)楦吲d,而是因?yàn)橛侄嗔艘环N語(yǔ)言。他們覺(jué)得現(xiàn)在的語(yǔ)言太多了,沒(méi)有必要再多出一種來(lái)添亂子。但是當(dāng)他們看完C#的文檔后又開(kāi)始高興起來(lái),因?yàn)镃#是如此簡(jiǎn)單:事實(shí)上,簡(jiǎn)單正是C#最大的特點(diǎn)。除此之外,它還具有現(xiàn)代、面向?qū)ο?、?lèi)型安全、版本控制、兼容、靈活等特點(diǎn)。詳細(xì)介紹請(qǐng)參閱rainbow(一個(gè)長(zhǎng)著胡子的彩虹)翻譯的<<展現(xiàn)C#>> ,前幾章非常的有趣。
看完了前面幾段,我的朋友提出了不同的意見(jiàn):C#不是Java的Clone,它只是長(zhǎng)得有些像Java而已,其實(shí)面向?qū)ο?、中間語(yǔ)言什么的也不是什么新玩意兒,非Sun獨(dú)創(chuàng),有文為證:華山論劍:C#對(duì)Java。另外他對(duì)我上一集中說(shuō)Microsoft越來(lái)越不要臉也極為生氣,因?yàn)橄啾戎?,Sun也不怎么樣,微軟已經(jīng)將C#提交設(shè)在日內(nèi)瓦的ECMA(European Computer Manufacturers' Association,國(guó)際標(biāo)準(zhǔn)化機(jī)構(gòu)歐洲電子計(jì)算機(jī)工業(yè)會(huì))并獲得批準(zhǔn)。Sun就從來(lái)沒(méi)有將它的Java交給過(guò)ECMA,以至于正當(dāng)Microsoft盡力在Visual J++基礎(chǔ)上拓展Java功能,并使之與Windows操作系統(tǒng)緊密結(jié)合在一起的時(shí)候,Sun公司對(duì)Microsoft提出了法律訴訟,控告Microsoft違反了許可證協(xié)議中的條款,最終的結(jié)果是Microsoft公司不得不停止其Visual J++產(chǎn)品的開(kāi)發(fā)。(Microsoft后來(lái)在完全面向.NET框架的開(kāi)發(fā)語(yǔ)言集中加入了Visual J#.NET,算是對(duì)Java語(yǔ)言用戶的一種照顧。)
有人說(shuō),選擇C#意味著選擇MS(在中國(guó)的程序員當(dāng)中,這并不是件值得自豪的事。如果你還不能理解這種心情,可以試想一下有人很認(rèn)真地對(duì)你講他喜歡聽(tīng)毛寧的歌)。事實(shí)上,通過(guò)ECMA標(biāo)準(zhǔn)的C#可以由任何人在任何平臺(tái)上設(shè)計(jì)出它的開(kāi)發(fā)程序。比如Ximian公司的Mono工程,可以使開(kāi)發(fā)者能夠編寫(xiě)同時(shí)在Windows和Linux上運(yùn)行的.Net程序,這些程序甚至還可能在其它非Windows的操作系統(tǒng)上運(yùn)行,比方Unix。這一段時(shí)間我正在Linux下試驗(yàn)這個(gè)工程,遺憾的是,還沒(méi)有成功。
一位師兄對(duì)此種比較頗為不屑,他認(rèn)為只要選一種語(yǔ)言去學(xué)就好了,“重要的是你要用它,并且做的比別人好?!边@讓我想起來(lái)一直都很喜歡的那個(gè)歌:把你自己該做的那份工作,做得比別人出色。年輕的時(shí)候我老是用這句話自勉……
寫(xiě)到這里我發(fā)現(xiàn)這個(gè)故事還沒(méi)有提到桐桐,這篇東西是為她而作。我早在十八個(gè)月以前就答應(yīng)了她,我答應(yīng)了她很多事,但還沒(méi)有完成一件,現(xiàn)在我要一件一件的去實(shí)現(xiàn)。所以這個(gè)故事還應(yīng)該有個(gè)更好的開(kāi)始。
2000年6月我大學(xué)畢業(yè),從北京回到了石家莊,到一家什么都做的公司上班(做一個(gè)網(wǎng)站),最開(kāi)始制作界面,然后用asp編程,如果你用過(guò)asp就會(huì)知道,這是個(gè)很無(wú)聊的工種。在此之前我在一家報(bào)社實(shí)習(xí),為他們的網(wǎng)站做設(shè)計(jì)和動(dòng)畫(huà)。在那里我認(rèn)識(shí)了桐桐。
那時(shí)候她還在上學(xué)。