1.4 第一個Windows應用程序
Windows Forms就是Windows窗體的意思。它是.NET Framework的一部分。程序在運行時,每一個窗體都是可視化的。其定義了窗體外觀屬性、行為、方法和與用戶交互的事件。在Visual Studio 2010中通過設置窗體屬性和編寫代碼來響應窗體事件,可以開發出一些基本的窗體應用程序。Windows窗體還能作為其他控件的容器,開發者可以將控件拖放在Windows窗體上,如Button(按鈕)、TextBox(文本框)等。
1.4.1 什么是Windows應用程序
這里的Windows應用程序指Windows窗體應用程序,也可以指服務在操作系統底層,看不見運行界面的程序,這是一個較開放的概念。總的來說,它是運行在Windows平臺上的程序,用于服務用戶,其定義了窗體的外觀屬性、行為方法與用戶交互事件等。設計者可以通過修改窗體的屬性或者添加代碼來響應窗體的事件。例如記事本就是一個窗體程序,它就是一個Windows應用程序。
注意:控制臺程序是Windows系統組件的一部分,而Windows應用程序是指可以在Windows平臺上運行的所有程序。不同的地方在于一個是Windows系統自帶的;另一個可能是第三方開發的,也可能是Microsoft公司自己開發的。
1.4.2 開發Hello World Windows應用程序
啟動Visual Studio 2010,依次選擇“文件”|“新建”|“項目”命令,彈出如圖1.16所示的對話框。展開“已安裝的模板”中“Visual C#”節點。然后選擇“Windows”|“控制臺應用程序”命令。輸入應用程序的名稱,選擇合適的路徑保存。

圖1.16 創建Hello Word窗體應用程序
提示:在創建應用程序時,請選擇好所需的.NET Framework的環境版本,如圖1.16右上角所示。本書中將以.NET Framework 4.0版本為例進行講解,它是目前Visual Studio 2010集成開發環境中默認支持的最高版本。
【范例1-1】創建Hello Word窗口應用程序,其功能是在控制臺中輸出“Hello World”字符串,如示例代碼1-1所示。
示例代碼1-1
01 using System; //包含基本類和基類 02 using System.Collections.Generic; //定義泛型集合的接口和類 03 using System.Linq; //支持語言集成查詢 04 using System.Text; //包含用于字符編碼等功能的對象 05 namespace Ex_1_1 //類命名空間,也是項目名稱 06 { 07 class Program 08 { 09 static void Main(string[] args) //主函數,入口函數 10 { 11 Console.WriteLine("Hello World"); //輸出“Hello World”字符串 12 Console.ReadLine(); //獲取輸入焦點,這里為了運行結果在DOS //窗口中停留 13 } 14 } 15 }
【運行結果】選擇“調試”|“啟動調試”命令運行程序,結果如圖1.17所示。
【代碼解析】該段代碼第09行~13行是C#程序必須包含的Main方法,用于控制程序的開始和結束。在Main方法中創建對象和執行其他方法。第11行語句Console.WriteLine("Hello World")使用了WriteLine方法,該方法用于輸出字符串和字符等,輸出信息后面跟一個新的行,即換行。

圖1.17 Hello World運行結果
第09行是Main方法,它是C#語言中所有程序的入口點。但是,庫和服務不要求將Main方法作為入口點。應用程序啟動時,Main方法是第一個調用的方法。C#程序中只能有一個入口點。如果有多個類都包含Main方法,則必須使用“/main”編譯器選項編譯,指定一個用做入口點的Main方法。
注意:所有的C#源代碼都以語句“using System;”開頭,這是因為Microsoft公司提供的許多有基類的基本類都包含在System命名空間中。如果程序開始處沒有包含“using System;”指令,則輸出語句必須這樣寫才能編譯通過System.Console.Writeline。如果包含了“System”命名空間,無須完全限定System類和方法即可直接使用它們。例如可以改寫為“Console.WriteLine”,而不必寫成“System.Console.Writeline”。
在范例1-1中,using System表示導入名字空間,其他的類似。高級語言總是依賴于許多系統預定義的元素或者庫函數,例如在范例1-1中的輸出函數就依賴于System命名空間。如果是C或C++程序,那么就使用#include之類的語句來導入。在C#語言中的含義與此類似,其用于導入預定義的類或者函數,這樣在自己的程序中就可以自由地使用這些元素。如果沒有導入名字空間的話,就必須把上述代碼改寫成如下所示。
01 namespace Ex_1_1 //類命名空間,也是項目名稱 02 { 03 class Program 04 { 05 static void Main(string[] args) //主函數,入口程序 06 { 07 System.Console.WriteLine("Hello World"); //輸出Hello World 08 System.Console.ReadLine(); //獲取輸入,這里是為了運行 //結果窗口停留 09 } 10 } 11 }
提示:在每個Console前加上一個前綴System.,這個小圓點“.”表示Console是作為System的成員而存在的。關于成員的概念,初學者可以把它理解為某某的一個組成部分。在本書第4章,成員的概念會使用得比較多。
在C#語言中,程序所完成的輸入輸出功能都是通過Console來完成的,Console是在名字空間中System已經定義好的一個類。這里不用管它是怎么完成工作的,只要使用它就可以了。上面的代碼中,類Console展現了兩個最基本的方法WriteLine和ReadLine。
Console.ReadLine()表示接收輸入設備,Console.WriteLine用于在輸出設備上輸出。Console中用于輸入/輸出的另兩個方法是Read和Write。它們和ReadLine與WriteLine的不同之處在于:ReadLine和WriteLine執行時相當于在顯示時多加了一個Enter鍵。而使用Read和Write時則光標不會自動轉移到下一行。
警告:在C#程序中,程序的執行總是從Main()方法開始的,一個程序中不允許出現兩個或兩個以上的Main()方法。對于習慣了寫C語言的讀者,請務必記住:C#語言中Main()方法必須被包含在一個類中。