?? c#網絡編程寶典(1).txt
字號:
C#網絡編程寶典(1)
--------------------------------------------------------------------------------
第八軍團 時間:2003-11-23 9:16:37
從這一期起,我們將通過一系列文章來詳細介紹如何利用C#開發網絡應用程序。C#,讀作“C-Sharp”,是微軟推出的新一代軟件開發語言。或許你會問,目前已經有了這么多開發語言,如Visual C++、Visual Basic、Java等,為什么還要推出C#呢?下面就來先解答一下這個問題。
簡單地說,C#是未來的主流開發語言。因為在未來的企業計算領域,C#將會成為用于編寫“下一代窗口服務”(Next Generation Windows Services,簡寫為NGWS)應用程序的主要語言。C#是專門為.NET平臺度身定做的一種開發語言,它既擁有Visual Basic簡單易用的特性,同時又具備Visual C++強大的功能。此外,C#背靠微軟,微軟為.NET框架投入的人力和物力比已往任何一個系統都多也是一個不爭的事實。雖然目前使用C#開發應用程序并不普遍,但可以預見,隨著下一個視窗操作系統——Windows .NET Server的推出,.NET框架將內嵌在操作系統之中,C#必定有著更廣大的發展空間,所以對于程序員,尤其是那些將要加入程序員行列的人而言,C#是一個非常明智的選擇。
一、C#——一種新的開發語言
雖然C#是從C/C++家族中演化而來的,如C#和C++的百分之九十九的語法都相同,但作為一種全新的開發語言,C#比C++有更多的優點。下面就通過它和C++比較,看看它到底“新”在哪里:
●簡潔實用
C#和C++相比較,最大的特點就是簡潔與實用。首先,使用C#的開發者再也不必擔心C++中的內存管理和指針之類的煩雜問題。其次,C#中的操作符與C++相比大大地減少了。比如,C++中關于類成員及類方法有“::”、“.”和“->”三種操作符,分別用于不同的環境,而C#中只要用“.”操作符就可以了。由于C#使用統一的類型系統,它徹底摒棄了C++中多變的類型系統。C#也徹底解決了存在于C++中已經有些年頭的冗余的東西,如常數預定義、不同字符類型等。
●流行現代
學習并掌握C#要花費很多的時間和精力,但絕對是一筆很值得的投資。因為C#是為編寫NGWS應用程序的主要語言而設計,掌握了C#也就掌握了未來的編程語言的主流。使用過C#的程序員會發現很多用C++實現起來非常困難的功能,在C#中不過是一個基本的功能而已。同樣,如果你是一個企業級的程序員,一定非常喜歡新增的金融數據類型。這是一種新的十進制數據類型,它專用于金融計算方面。C#同樣允許程序員根據自己的愛好或者特殊的需要,非常容易地創建出新的一種數據類型。C#能夠保證編寫的應用程序更安全。這是因為C#提供了元數據語法,用于聲明下述NGWS安全模式的能力和許可。元數據是NGWS運行時的一個關鍵的概念,它是描述和引用VOS(虛擬對象系統,Virtual Object System)類型系統所定義的一種類型。其永久格式與編程語言無關。
●完全面向對象
C#是一個完全的面向對象開發語言,支持面向對象的所有關鍵概念,如封裝、繼承和多態性。完整的C#類模式構建在NGWS運行時的虛擬對象系統(簡稱VOS,Virtual Object System)的上層,所以對象模式只是基礎的一部分,不再是編程語言的一部分。在C#中不再有什么全局函數、變量或者是常量。所有的東西都封裝在類中。這些使得C#代碼更加易讀且有助于減少潛在的命名沖突。
●安全可靠
C++中,指針能自由地強制轉換成為任何類型,甚至可以實現把int *(整型指針)強制轉換成一個double *(雙精度指針)。當然這需要內存支持這種操作。但這決不是你所想象的企業級編程語言的類型安全。C#實施最嚴格的類型安全,以保證應用程序及垃圾收集器(garbage collector)能夠正確運行。如在C#中不能使用沒有初始化的變量。對于對象的成員變量,編譯器負責清零。而局部變量,則由程序員負責清零。當程序中使用一個沒有初始化的變量時,編譯器會發出提示,并引導你如何做。這樣就能夠避免由于使用不經初始化的變量計算結果而導致的錯誤,而這些錯誤是很難發現的。C#取消了不安全的類型轉換,比如你不能把一個整型強制轉換成一個引用類型(如對象)。邊界檢查是C#類型安全的一部分。數組定義了n-1個元素卻超額地使用了n個元素的情況在C#中是不會出現。C#通過在語句級或應用程序級來檢測,算術運算是否溢出終值數據類型的范圍。在允許檢測溢出的情況下,當溢出發生時將會拋出一個異常。在C#中,被傳遞的引用參數是類型安全的。
●版本可控
幾乎所有的程序員都遇到過“DLL陷阱”的頭疼事情。問題起因于多個應用程序都安裝了相同名字DLL的不同版本。有時,老版本的應用程序可以很好地和新版本的DLL一起工作,但是更多的時候它們會中斷運行。C#可以最好地支持版本控制。盡管C#不能確保正確的版本控制,但是它可以為程序員保證版本控制成為可能。有這種支持,一個開發人員就可以確保當他的類庫升級時,仍保留著對已存在的客戶應用程序的二進制兼容。
●兼容性
C#雖然是開發NGWS應用程序的主要語言,但也可以方便的通過互操作來訪問現有的COM組件和Win32 API函數,這樣就能夠最大程度的利用現有的資源。
上面描述了C#的種種優點,那么或許你會問,C#最終會取代C++么?其實不然。答案非常明顯,第一,C++已經發展了許多年了,有大量的使用者,這些資源不容浪費。第二,C++在性能和對底層控制上的能力是C#難以比擬的。所以說C#雖有優點,但C++也不是沒有長處,在可以預見的將來,它們將會相處很長時間。
綜上所述,C#是一種優雅、簡單、類型安全、面向對象的語言,C#的語言特色都和.NET平臺有著密不可分的關系,比如C#本身無類庫,它使用的是.NET FrameWork SDK所提供的類庫——.NET FrameWork SDK。此外,C#擁有的類型安全檢驗、垃圾的自動回收以及結構化的異常處理等操作,也都是直接交給.NET平臺中的通用語言運行時(Common Language Runtime,簡稱CLR)來處理的。所以說C#是最適合開發.NET平臺下的應用程序的程序語言。
二、用C#編寫“Hello World!”
當開始介紹一種新的語言的時候,好像已經成為了一種約定,都是從編寫輸出字符串“Hello World!”的程序開始的(順便插一句:有人說程序員都很古板,我看不一定,“Hello World!”不就充分體現出程序員的浪漫情懷)。本節便來介紹一下C#是如何編寫、編譯“Hello World!”程序的。
我編寫、調試和運行的軟件環境為:視窗2000服務器版、.NET FrameWork SDK 1.0正式版。在.NET FrameWork SDK 1.0正式版中不僅提供了類庫和編譯器,還提供了編寫、構建、測試和部署.NET 框架應用程序所需的文檔、示例代碼、命令行工具。你可以從地址http://www.microsoft.com/china/msdn/downloads/msdncompositedoc.asp中下載這個軟件開發包。.NET FrameWork SDK 1.0正式版可是一個131M的大文件,要下載的朋友可要有點心理準備。要安裝.NET FrameWork SDK 1.0正式版,必須保證你的操作系統是下列之一:
(1)Microsoft Windows NT 4.0(需要安裝SP 6a)
(2)Microsoft Windows 2000(建議使用SP2)
(3)Microsoft Windows XP Professional
(4)Microsoft Windows .NET Server
系統還必須滿足下列軟件要求:
(1)IE 5.01版(推薦使用IE 6.0)。
(2)Microsoft Data Access Components 2.6(MDAC2.6),推薦采用MDAC 2.7。
(3)Internet Information Services(IIS)5.0版或更高版本。
現在我們開始編寫C#版本的“Hello World!”程序。首先打開一個文本編輯器,你可以使用Windows自帶的NotePad或者其他的行編輯器,把下列的代碼輸入到編輯框中。請注意,代碼中每一行前面的數字代表行號,是為方便后面的程序說明而添加上的,實際輸入時應該忽略掉這些數字:
1 using System;
2 namespace temp
3 {
4 class HelloWorld
5 {
6 public static void Main()
7 {
8 Console.WriteLine (" Hello World ! ") ;
9 }
10 }
11 }
然后把文件另存為HelloWorld.cs文件(注:"cs"是C#源文件的擴展名)。這樣"Hello World!"程序的C#版本就產生了。雖然HelloWorld.cs非常短小,但基本具備了C#程序的框架結構,下面就結合HelloWorld程序來具體探討一下。
第1行的作用是告訴編譯器,此程序要引用命名空間“System”。引用命名空間使用的是“using”關鍵字。至于在哪個文件中找“System”命名空間,是通過編譯的時加入“r”參數實現的,具體可參見下面的編譯命令。引入“System”命名空間,是為了達到簡化后面程序編碼的效果。這是因為后面使用到的“Console”類就被封裝在“System”命名空間中。引用命名空間后,再調用Console類中的WriteLine方法時,就可以直接用Console.WriteLine來代替System.Console.WriteLine了。由于HelloWorld程序的代碼量很小,簡化編碼的效果并不明顯,但對于代碼量大、使用了許多命名空間的程序,這種簡化作用就非常明顯了。由于引用命名空間所起的只是簡化編碼的作用,所以這一行代碼并不是非要不可的。
第2行是在C#程序中定義命名空間,這里的命名空間的名稱可以看成和上面的“System”命名空間相類似。其實定義命名空間對于“Hello World!”程序是沒有什么太多意義的,因為“Hello World!”程序從本質上是一個控制臺程序。而定義命名空間主要的作用是聲明一個范圍,此這個范圍允許組織代碼并為你提供了創建全局唯一類型的方法。在C#組件編程中,定義命名空間是很有意義的,因為在一個命名空間中,可以在定義若干個類。所以定義命名空間這一句,對于“Hello World!”程序也不是非要不可的。
第4行是在程序中創建一個類,類的創建過程對于“Hello World!”程序是必須的,因為C#程序的入口函數Main()就必須位于類或者結構體之中。當然這個類的名稱,在“Hello World!”程序中是可以隨意設定,這都不妨礙程序的正確編譯和執行,但如果編寫的程序要編譯成的是類庫文件,就必須要明確定義的類的名稱,因為在程序調用的時候要使用這個名稱。這是后話了。
第6行是申明Main()函數(也叫Main方法),Main()函數是編譯器規定的所有可執行程序的入口點,并控制程序的開始和結束,用戶在Main函數中創建對象和執行方法。由于Main()函數的特殊性,Main()函數在程序中必須遵循下列原則:
1.Main()函數必須封裝在類或結構里來提供可執行程序的入口點。
2.Main()函數必須是一個靜態函數(static)。正如前文所說,Main()函數也可以看成是一個方法,而這個方法就被封裝在HelloWorld類中。把Main()函數定義為靜態函數,就意味著,在C#中不用創建實例就可以調用此方法。
3.Main()函數對于保護級別沒有特殊要求,public、protected、private等都可以,但一般都指定其為public,有些時候還不指定保護級別。
4.C#對大小寫非常敏感,無論是引用命名空間,調用類庫等。書寫不正確則編譯器無法識別,并返回錯誤值。
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -