《.net編程先鋒C#》第三章 第一個C#應用程序(轉)
2024-07-10 13:02:17
供稿:網友
注冊會員,創建你的web開發資料庫,第三章 第一個c#應用程序
3.0 選擇一個編輯器
盡管我是一個頑固的notepad狂,但這次我不建議用它編輯源碼。原因是你正在與真正的編程語言打交道,使用notepad編輯源碼編譯時可能產生大量的錯誤信息行(c++程序員知道我在說什么。)
你有幾種選擇??梢灾匦屡渲媚阈湃蔚睦鲜絭isual c++ 6.0,使它能夠和c#源文件一起工作。第二種選擇是使用新的visual studio 7。第三,你可以用任何第三方程序編輯器,最好要支持行數、色彩編碼、工具集成和良好的搜索功能。codewright就是其中一個例子,如圖3.1所示。
圖3.1 codewright 是你可以用于創建c#代碼文件眾多可能編輯器中的一個。
當然,在所提到的編輯器中,沒有一個對創建c#程序來說是必要的。用notepad肯定可以編輯。但是,如果你考慮到要編寫更大的項目,最好還是忍痛割愛吧。
3.1 "hello world" 代碼
討論編輯器有點離題 ,讓我們把話題轉回到一個非常出名的小應用程序。這個最短的c#版本應用程序見清單3.1。把它存起來,文件名為 helloworld.cs,以便使你能按照說明,完成諸如編譯應用程序等其它余下來的步驟。
清單 3.1 最簡單的 "hello world "程序
1: class helloworld
2: {
3: public static void main()
4: {
5: system.console.writeline("hello world");
6: }
7: }
在c#中,代碼塊(語句組)由大括弧({和})所括住。所以,甚至你以前沒有c++的經驗,你也可以說出main()方法就是helloworld 類語句的一部分,因為類被括在所定義的大括弧中。
c#應用程序(可執行)的入口點就是 static main 方法,它必須包含在一個類中。僅有一個類能使用該標志定義,除非你告訴編譯器它應使用哪一個 main 方法(否側,會產生一個編譯錯誤)。
和c++相比,main的第一個字母是大寫的m,而不是你曾經使用過的小寫字母。在這個方法中,你的程序開始并結束。方法中可以調用其它方法——如這個例子中,用于輸出文本——或者創建對象并激活該方法。
正如你所看到的,main方法返回一個void類型。
public static void main()
盡管看到這些語句時,c++程序員肯定會覺得似曾相識,但是其他程序員并不如此。首先,public 的訪問標志告訴我們這個方法可以被任何程序訪問,這是它被調用的必要條件。其次,static 意味著沒有先創建類的實例也可以調用方法——你所要做的就是用類名調用方法。
helloworld.main();
但是,我不贊成在main方法中執行這行代碼,遞歸會導致堆棧溢出。
另一重要的方面是返回類型。對于方法main,可選擇void (意味著根本就沒有返回值),或用int 為整型結果(應用程序返回的錯誤級別)。因此,兩種可能的main方法為:
public static void main()
public static int main()
c++程序員會同樣知道后面我要提到的——可以傳給應用程序的命令行參數數組。如:
public static void main(string[] args)
我現在并不想詳細地說明如何訪問參數,但我想事先給c++程序員一個警告:和c++相比,應用程序路徑不是這個數組的一部分。僅僅那些參數包含在這個數組中。
在對main方法并不簡短的介紹之后,讓我們把注意力集中到唯一真正的代碼行——這行代碼在屏幕上顯示"hello wold"。
system.console.writeline("hello world");
假如不是由于有了system,大家會馬上猜到writeline是console 對象的一個靜態方法。那么system代表什么呢? 它是包含console對象的名字空間(范圍),實際上并不是每次都在console對象前加上名字空間的前綴,你可以象清單3.2所示范的那樣,在應用程序中引入名字空間。
清單3.2 在應用程序中引入名字空間
1: using system;
2:
3: class helloworld
4: {
5: public static void main()
6: {
7: console.writeline("hello world");
8: }
9: }
所有你要做的就是給system名字空間加一個using指令。在這之后,不再需要規定名字空間,就可以使用它們的方法和屬性了。ngws 框架體系中有很多的名字空間,我只對巨大的名字空間池中的少數幾個對象進行探討。但在第八章 "用c#寫組件"將介紹為你的對象創建自己的名字空間。
3.2 編譯應用程序
由于ngws runtime支持所有的編譯器(vb、c++和c#),你不必買一個單獨的開發工具用來把應用程序編譯成il(中間語言)。但是,如果你從沒有用過命令行編譯器編譯過應用程序(僅懂得編譯名,而沒有熟記), 它還是你的首要選擇。
打開命令提示符并切換到存 helloworld.cs 的目錄。敲入以下命令:
csc helloworld.cs
helloworld.cs 被編譯并鏈接成hellworld.exe。因為源碼沒有錯誤(那當然!),c#編譯器沒有出錯提示,在整個編譯過程沒有絲毫停頓。如圖3.2所示。
圖3.2 使用命令行編譯器 csc.exe 編譯應用程序
現在你已經準備好運行第一個真正用c#編寫的應用程序。簡單地在命令行上敲入helloworld,輸出結果為 "hello world"。
在繼續往下介紹之前, 我想稍為想象一下第一個應用程序和一個編譯器開關的使用:
csc /out:hello.exe helloworld.cs
這個開關告訴編譯器輸出文件命名為hello.exe。雖然這不是什么絕招,但它是這本書中用到的未來編譯器的基本功。
3.3 輸入和輸出
到目前為止,我僅僅演示了把簡單的常量字符串輸出到屏幕。盡管這本書只介紹了c#編程的概念而不介紹用戶接口編程,但我需要讓你迅速學會簡單的屏幕輸入和輸出方法——相應于c的scanf 和 printf,或者c++的cin 和cout。我不能提供vb相應的函數,因為屏幕訪問不是該核心語言的一部分。
你只需要能夠讀用戶的輸入并提示一些信息給用戶。清單3.3 說明如何讀一個用戶請求的名字輸入,并顯示一條已定制好的"hello" 信息。
listing 3.3 從控制臺讀輸入信息
1: using system;
2:
3: class inputoutput
4: {
5: public static void main()
6: {
7: console.write("please enter your name: ");
8: string strname = console.readline();
9: console.writeline("hello " + strname);
10: }
11: }
第7行使用console對象的一個新方法用于提示文本信息給用戶,它就是write方法。它與writeline不同的地方在于它輸出時不換行。我使用這種方法以便用戶可以在信息提示的同一行輸入名字。
在用戶輸入他的名字后(并按回車鍵),readline 方法讀入了一個字符串變量。名字字符串連接到常量字符串"hello",并用我們早已熟悉的writeline方法顯示出來(見圖3.2)。
圖3.3 編譯和運行定制的hello 應用程序
你幾乎已學完了ngws框架必要的輸入和輸出功能。但是,你還需要為用戶顯示多個值。為用戶寫一個格式串。清單3.4展示一個例子。
清單 3.4 使用不同的輸出方法
1: using system;
2:
3: class inputoutput
4: {
5: public static void main()
6: {
7: console.write("please enter your name: ");
8: string strname = console.readline();
9: console.writeline("hello {0}",strname);
10: }
11: }
第9行包含了使用格式串的console.writeline語句。格式串例子如下:
"hello {0}"
{0}代替writeline方法的參數表中緊隨格式串后的第一個變量。你可以用該技術格式化超過三個變量。
console.writeline("hello {0} {1}, from {2}",
strfirstname, strlastname, strcity);
當然,并不僅限于只使用字符串變量。你可以使用任何類型,這些類型在后面的第四章 "c#類型"中有討論。
3.4 添加注釋
當寫代碼時,你應為代碼寫注釋條文,解釋實現的內容、變更史等。盡管你注釋中提供的信息(如果有的話)是給你寫的,但是你還是必須遵守寫c#注釋的方法。清單3.5 顯示采用的兩種不同的方式。
清單3.5 給你的代碼添加注釋
1: using system;
2:
3: class helloworld
4: {
5: public static void main()
6: {
7: // 這是單行注釋
8: /* 這種注釋
9: 跨越多行 */
10: console.writeline(/*"hello world"*/);
11: }
12: }
"//" 符號用于單行注釋。你可以用"//"注釋當前所在行,或是跟在一個代碼語句的后面:
int nmyvar = 10; // 胡說八道
所有在"//"后面的被認為是一條注釋;所以,你可以同樣用它們來注釋一整行或一行源代碼的部分。這種注釋方式同c++中介紹的相似。
如果你的注釋跨越多行,必須使用"/* */"的字符組合。這種方式在c中有效。除了單行注釋外,這種方式在c++和c#中還同樣有效。因c/c++和c#都使用這種多行注釋方式,所以它們也使用相同的終結符。請看下列代碼行:
/* console.writeline("hello world"); */
我使用"/* */"簡單地注釋一整行。現在我假定這一行是很長代碼的一部分,而且我決定要暫時禁用一個程序塊:
/*
...
/* console.writeline("hello world"); */
...
*/
這個結構所存在的問題為: "hello world"那一行后面的"*/"終止了始于第一行的"/*"的注釋,余下的代碼對編譯器有效,你將看到一些有趣的出錯信息。至少 最后的"*/"被標志為歸屬錯誤。我只不過想提醒一下,讓你了解這種錯誤。
3.5小結
在這一章中,你創建、編譯并執行了第一個c#應用程序:著名的"hello world"程序。我用這個短短的應用程序給你介紹有關main方法,它是一個應用程序的入口點,也是出口點。這個方法可以沒有返回值或返回一個整數錯誤級別。如果你的應用程序用參數調用,你可以(但不必要)讀出并使用它們。
在編譯和測試應用程序后,你學到了更多的由console對象提供的有關輸入和輸出的方法。對于學習c#而言,它們足以創建出有意義的控制臺例子,但用戶接口的大部分將是wfc、winforms或者asp+。