程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> 關於C# >> 編寫第一個C#應用程序

編寫第一個C#應用程序

編輯:關於C#

介紹了C#語言的這麼多優點,您可能已經有些不耐煩了。好,那就讓我們開始C#的開發之路吧。

本章介紹如何生成您的第一個C#程序。這是一個最基本的C#應用程序,程序中的代碼在全書中將經常出現。

我一直堅信,只有不斷練習才是最好的學習方式。所以建議讀者從本章開始,對書中所提供的程序示例,親自進行編輯、編譯和運行,在這個過程中,您將獲得開發C#程序的有益經驗。

3.1 Welcome程序

可以這麼說,與用戶沒有任何交互的應用程序根本沒有任何用處(病毒和黑客當然除外。然而即使是病毒程序的作者,也常常喜歡在自己得逞之後炫耀一番)。學習任何一門語言,絕大多數情況下人們都是從輸入和輸出開始的。

第一個程序總是非常簡單的。我們讓用戶通過鍵盤輸入自己的名字,然後程序在屏幕上打印出一條歡迎信息。程序的代碼是這樣的:

程序清單3-1:

using System;

class Welcome

{
   static void Main(){
     Console.WriteLine("Please enter your name:");
     Console.ReadLine();
     Console.WriteLine("Welcome to you!");
  }
}

您可以在任意一種編輯軟件中完成上述代碼的編寫,然後把文件存盤,文件名叫做Welcome.cs。典型的C#源文件通常都是以“.cs”作為文件的擴展名。

3.2 代碼分析

首先要提出的是,C#語言是大小寫敏感的。這一點對於C和C++程序員沒什麼問題,只是要提醒一下VB和Delphi程序員。

接下來讓我為您逐條分析上面的C#程序語句。

3.2.1 名字空間

using System表示導入名字空間。高級語言總是依賴於許多系統預定義的元素。如果您是C或C++程序員,那麼您一定對使用#inclued之類的語句來導入其它C或C++源文件再熟悉不過了。C#中的含義與些類似,用於導入預定義的元素,這樣在自己的程序中就可以自由地使用這些元素。

如果沒有導入名字空間的話,我們該怎麼辦呢,程序還能保持正確嗎?答案是肯定的。那樣的話,我們就必須把代碼寫成下面的樣子:

程序清單3-2:

   class Welcome
   {
    static void Main(){
         System.Console.WriteLine("Please enter your name:");
         System.Console.ReadLine();
         System.console.WriteLine("Welcome to you!");
     }
    }

也就是說,在每個Console前加上一個前綴"System."。這個小原點“.”表示Console是作為System的成員而存在的。C#中拋棄了C和C++中繁雜且極易出錯的操作符象“::”和“->”等。C#中的復合名字一律通過“.”來連接。

System是.NET平台框架提供的最基本的名字空間之一。有關名字空間的詳細使用方法我們將放在第十七章中詳細介紹。在這裡,只要我們學會怎樣導入名字空間就足夠了。

3.2.2 類和類的方法

讓我們從寫第一個程序時就記住:每個東西都必須屬於一個類。如果您是C或C++的程序員,請暫時忘掉那些全局變量。

在程序的第二行,class Welcome聲明了一個類,類的名字叫做Welcome。這個程序為我們所作的事情就是依靠它來完成的。

和C、C++中一樣,源代碼塊被包含在一對大括號“{”和“}”中。每一個右括號“}”總是和它前面離它最近的一個左括號“{”相配套。如果左括號“{”和右括號“}”沒有全部配套,那程序就是一個錯誤的程序。

static void Main()表示類Welcome中的一個方法。方法總是為我們完成某件工作的。

注意:在C#程序中,程序的執行總是從Main()方法開始的。一個程序中不允許出現兩個或兩個以上的方法。對於習慣了寫C控制台程序的讀者,請牢記:C#中Main()方法必須被包含在一個類中。

3.2.3 程序的輸入和輸出

程序所完成的輸入和輸出功能都是通過Console來完成的。Console到底是什麼呢?它是在名字空間中System已經為我們定義好的一個類,這裡我們不用管它是怎麼完成工作的,只要使用它就可以了。

上面的代碼中,類Console為我們展現了兩個最基本的方法:WriteLine和ReadLine。
Console.ReadLine表示接受輸入設備輸入,Console.WriteLine則用於在輸出設備上輸出。

我們再為讀者介紹Console中用於輸入輸出的另兩個方法:Read和Write。它們和ReadLine與WriteLine的不同之處在於,ReadLine和WriteLine執行時相當在顯示時多加了一個回車鍵,而使用Read和Write時則光標不會自動轉移到下一行。

讓我們再對例子程序進行擴展,使得用戶的輸入對輸出產生作用。

程序清單3-3:

 using System;
 class Welcome
 {
  Static void Main(){
       Console.WriteLine("please enter your name:");
       string name=Console.ReadLine();
       Console.WriteLine("Welcome to you,{0}!",name);
  }
}

我們用到了string name=Console.ReadLine()這條語句。其中string name表示聲明一個字符串類型的變量 name。系統定義的Console類提供的方法ReadLine()的返回值類型為string。所以,這句話表示從輸入設備讀取一個字符串,並把讀取的值賦予變量 name。

再來看一下程序的最後一條輸出語句:

Console.WriteLine("Welcome to you,{0}!",name);

這條語句表示在屏幕上對輸出的字符串進行格式化。其中表示用方法的第二個參數來替代格式化後字符串相應的位置。對字符串進行格式化的參數可以是一個字符串,也可以是一個字符,或者是一個整數,等等。采用這種方式最多可以格式化三個變量。比如:

int x=3;

string name1="Mike";

string name2="John";

Console.WriteLine("Welcome to you {0} times,{1} and {2}!",x,name1,name2);

和絕大多數編程語言一樣,C#提供了字符串類型string,它與C中的MFc為我們提供的類十分類似。C#中的string類型是一個引用類型(引用類型在第四章中我們有詳細說明),為標准字符集。利用string可以方便地對字符串進行連接、截斷等操作。

比如:

string s="Good"+"Morning";

char x=s[3];

例子演示了字符串s由兩個字符串"Good"和"Morning"相加得到。字符串還可以通過下標進行索引,得到一個字符。上面的例子中字符X的值為“d”。

所以,源程序3-4和源程序3-3沒有什麼區別:

程序清單3-4:

 using System;
 class Welcome
 {
  static void Main(){
       Console.WriteLine("Please enter your name:");
       string message="Welcome to you"+Console.ReadLine();
       Console.WriteLine(message);
  }
}

3.3 運行程序

理解了源程序中每條代碼的具體含義後,下一步要做的就是讓這個程序真正能夠運行。不過對源代碼即使還有不明白的地方也沒有關系,在後續章節的學習中,您最終會熟練掌握這些概念的。

如果您的電腦上安裝了Visual Studio.Net,則可以在集成開發環境(Integrated Developer Environment,IDE)中直接選擇快捷鍵或菜單命令,編譯並執行源文件。

如果您不具備這個條件,那麼您至少需要安裝Microsoft.Net Framework SDK,這樣才能夠不妨礙您在本書中繼續學習C#語言。實際上,.Net平台內置了C#的編譯器。

下面讓我們使用這個微軟提供的命令行編譯器對我們的程序進行編譯。

啟動一個命令行提示符,在屏幕上輸入一行命令:

csc welcome.cs

我們假設您已經將welcome.cs文件保存在當前目錄下。如果一切正常,welcome.cs文件將被編譯、運行,屏幕上出現一行字符,提示您輸入姓名:

Please enter your name:

輸入任意個字符並按下回車鍵,屏幕將打印出歡迎信息:

Welcome to you!

注意:和目前為止我們使用過的絕大多數編譯器不同,在C#中,編譯器只執行編譯這個過程,而在C和C++中要經過編譯和鏈接兩個階段。換而言之,C#源文件並不被編譯為目標文件(.obj),而是直接生成可執行文件(.exe)或動態鏈接庫(.dll)。C#編譯器中不需要包含鏈接器。

編譯選項

我們可以靈活地使用.Net平台提供的命令行編譯器的不同選項,選擇不同的編譯方式,從而靈活地對編譯進行控制。

例如,如果我們希望對源文件welcome.cs進行編譯,生成名為MyWelcome.exe的可執行文件,我們可以采用這樣的命令:

csc/out: MyWelcome.exe welcome.cs

如果我們並不需要一個可執行文件,而僅僅是希望簡單地檢查源文件中是否存在語法錯誤,則命令可以寫成:

csc/nooutput: welcome.cs

如果不知道各個選項的具體含義,可以通過求助來獲得:

csc/?

為方便讀者,我們在表3-1中按字母排序的順序列出了命令行編譯器csc常用的參數及其用途。更詳細的信息請參閱C#聯機幫助文檔。

表3-1 命令行編譯器選項

選項 作用 @ 指定響應文件 /? 列出編譯命令選項 /addmodule 指定一個或多個模塊作為裝配的一部分 /baseaddress 指定載入動態鏈接庫的首選地址 /bugreport 生成一個報告文件,其中包含程序Bug的詳細信息 /checked 指定算術運算的溢出是否會導致程序在運行時拋出一個異常 /codepage 指定編譯的所有源文件所使用的代碼頁 /debug 給出調試信息 /define 定義預處理程序的符號 /doc 由文件注釋生成XML文件 /fullpaths 指定輸出的絕對路徑 /help 列出編譯命令選項 /incremental 允許對源文件進行遞增式編譯 /linkresouce 在裝配時鏈接指定的NET資源 /main 指定Main方法所處的位置 /nologo 編譯過程中不顯示編譯信息 /nooutput 編譯源文件但不輸出 /nowarn 編譯過程中不生成警告信息 /optimize 指定編譯時是否進行優化 /out 指定輸出文件 /recurse 搜索子目錄以尋找源文件 /reference 從包含裝配的文件中導入元數據 /resource 把NEt資源內嵌到輸出文件 /target 指定輸出文件的格式 /target:exe 輸出文件為exe可執行文件 /target:library 輸出文件為鏈接庫 /target:module 輸出文件為模塊 /target:winexe 輸出文件為winexe可執行文件 /unsafe 允許編譯使用了不安全關鍵字的代碼 /warn 設置警告級別 /warnaserror 把警告信息作為錯誤看待 /win32icon 把.ico圖標文件插入到輸出文件 /win32res 把Win32資源插入到輸出文件

3.4 添加注釋

應用程序並不是只要你自己一個人能看懂就行了。不管以前計算機教師或者是編程書籍是否已經告誡過,這裡我還要一再強調:養成良好的代碼注釋的習慣。這是一名優秀的程序員所必備的條件之一。代碼注釋不會浪費您的編程時間,它只會提高您的編程效率,使您的程序更加清晰、完整、友好。

C#注釋的方式和C++沒有區別,每一行中雙斜槓“//”後面的內容,以及在分割符“/*”和“*/”之間的內容都將被編譯器忽略。

這樣,我們就可以采用“//”進行單行注釋,采用分割符“/*”和“*/”進行多行注釋。讓我們對Welcome程序加上注釋:

程序清單3-5:

//源文件:welcome.cs

/*說明:這裡是我的第一個

C#程序 */

using System;

class Welcome
{
  static void Main(){
      Console.WriteLine("please enter your name:");
      //要求用戶輸入姓名:
      Console.ReadLine(); //讀取用戶輸入;
      Console.WriteLine("Welcome to you!");
      /*本行代碼用於打印歡迎信息:
        您可以在這裡添加自己的代碼:
        程序在這裡結束*/
  }
}

上面的注釋似乎有些小題大作,但它畢竟說明了C#中注釋的使用方法。

下面是對C#程序進行注釋時要注意的兩個問題:

首先,避免在“//”之後的單行注解中使用反斜槓符號“\”。因為反斜槓符號“\”在C#中是一個續行符,這樣做往往會導致你所不希望的結果出現。例如,當你寫了類似於下面的代碼:

Console.WriteLine("The result is:{0}",//\
    150);

在編譯這段代碼時,“//”表示邏輯上同一行剩余的所有文字被作為注釋看待,而續行符“\”則將這一行同下一行連接起來,那麼第二行也被作為注釋的一部分。這時編譯器找不到與第一行的左括號“(”相匹配的右括號“)”,因此編譯出錯。

其次,分割符“/*”和“*/”之間的注釋不能有嵌套注釋。這是因為,C#編譯器從遇到第一個分割符“/*”開始,將忽略下一個“/*”,直到遇上下一個與之匹配的分割符“*/”才認為注釋結束,這樣編譯器就會對多余的“*/”報告錯誤,認為沒有“/*”與之相匹配。

一些程序員經常習慣於把程序中不需要或暫時不需要的代碼片段首尾分別加上分割符“/*”和“*/”。這時,如果這些代碼片段本身又含有注釋的話,我們所討論的這種錯誤就會發生。這時,我們建議您換一種方式,把預處理語句# if #endif等貫穿在程序中使用,因為它們可以強制編譯器忽略已包含注釋的源代碼片段,從而通過這種方式來實現源代碼的嵌套注釋。

以上提到的在注釋中可能發生的兩種問題,如果編譯器報告錯誤,那已經是幸運的了。如果是原本錯誤的程序被認為是正確的加以編譯,或者程序代碼的原意因此被曲解,造成的錯誤往往難以發現,那時造成的後果將會嚴重得多。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved