前言:表弟想要學編程,我推薦他學習.Net和C#。這一推薦不打緊,我卻承擔上了指導的職責。我又出差在外,直接輔導是不行了,通過郵件也太麻煩。推薦了幾本書,可惜他太菜了,總有無從下手的感覺。推及他人,在初學C#時,是否也有這樣的感覺呢?所以,就有了這個系列文章。表弟是我把他帶入電腦行業的,當初什麼都不懂,我曾經開啟電腦機箱,指點他哪裡是硬碟、哪裡是記憶體,是CPU,現在對於電腦硬體他早已可以做我師傅。希望學軟體編程也能這樣。
一、解決方案、項目、程式集、命名空間
初學者很容易把這些概念搞混淆。先說說項目(Project),通俗的說,一個項目可以就是你開發的一個軟體。在.Net下,一個項目可以表現為多種類型,如控制台應用程式,Windows應用程式,類庫(Class Library),Web應用程式,Web Service,Windows控制項等等。如果經過編譯,從副檔名來看,應用程式都會被編譯為.exe檔案,而其餘的會被編譯為.dll檔案。既然是.exe檔案,就表明它是可以被執行的,表現在程式中,這些應用程式都有一個主程式進入點,即方法Main()。而類庫,Windows控制項等,則沒有這個進入點,所以也不能直接執行,而僅提供一些功能,給其他項目調用。
在Visual Studio.Net中,可以在“File”菜單中,選擇“new”一個“Project”,來建立一個新的項目。例如建立控制台應用程式。注意在此時,Visual Studio除了建立了一個控制台項目之外,該項目同時還屬於一個解決方案(Solution)。這個解決方案有什麼用?如果你只需要開發一個Hello World的項目,解決方案自然毫無用處。但是,一個稍微複雜一點的軟體,都需要很多模組來組成,為了體現彼此之間的層次關係,利於程式的複用,往往需要多重專案,每個項目實現不同的功能,最後將這些公事包起來,就形成了一個完整的解決方案。形象地說,解決方案就是一個容器,在這個容器裡,分成好多層,好多格,用來存放不同的項目。一個解決方案與項目是大於等於的關係。建立解決方案後,會建立一個副檔名為.sln的檔案。
在解決方案裡添加項目,不能再用“new”的方法,而是要在“File”菜單中,選擇“Add Project”。添加的項目,可以是新項目,也可以是已經存在的項目。
程式集叫Assembly。學術的概念我不想提,通俗的角度來說,一個項目也就是一個程式集。從設計的角度來說,也可以看成是一個完整的模組(Module),或者稱為是包(Package)。因此,一個程式集也可以體現為一個dll檔案,或者exe檔案。怎樣劃分程式集也是大有文章的,不過初學者暫時不用考慮它。
命名空間(namespace)是在C++裡面就有的概念。引入它,主要是為了避免一個項目中,可能會存在的相同對象名的衝突。這個命名空間的定義,沒有特殊的要求。不過基本上來說,為了保證其唯一性,最好是用uri的格式,例如BruceZhang.com。這個命名空間有點像我們姓名中的姓,然後每個對象的名字則是姓名中的名。如果有重複,在國外的命名中,還可以加上middle name。那麼名都為“勇”的,由于姓氏不同也就分開了,或者叫張勇,或者叫趙勇。當然人的姓氏重複者居多,所以我們為命名空間取名時,儘可能的複雜一點。
有許多初學者,常常把一個項目就理解為一個命名空間。其實這兩者沒有絕對的聯絡,在項目裡我們也可以定義很多不相同的命名空間。但為了使用者便於使用,最好在一個項目中,其命名空間最好是一體的階層。在Visual Studio裡,我們可以在項目中建立一個檔案夾,預設情況下,該檔案夾下對象的命名空間,應該是“項目的命名空間.檔案夾名”。當然,我們也可以在namespace中修改它。
命名空間和程式集名,都可以在Visual Studio中設定。用滑鼠右鍵單擊項目名,就可以彈出如下對話方塊:
在圖中,Assembly Name就是程式集名,如果經過編譯,則為該項目的檔案名稱。而Default Namespace則為預設的命名空間。在開發軟體時,我們要養成良好的習慣,在建立新項目後,就將這些屬性設定好。一旦設定好了Default Namespace,則以後建立的對象,其命名空間即為該設定的值。至於程式集名,如果是dll檔案,建議其名最好與Default Namespace一致。
執行個體演練:
(一)建立控制台應用程式“Hello World!”
1、開啟Visual Studio.Net,選擇“File”菜單的“new”,選擇“Project”;
2、選擇Visual C# Projects中的“Console Application”,:
在Location中,定位你要儲存的項目的路徑,而名字則為“FirstExample”。該名字此時既是解決方案的名字,同時也是該項目的名字。
3、用滑鼠右鍵單擊項目名,在彈出的對話方塊中,將Assembly Name命名為HelloWorld,將Default Namespace命名為:BruceZhang.com.FirstExample。
4、此時Visual Studio中已經建立了一個檔案,其名為Class1.cs(如果是Visual Studio 2005,則預設為Program.cs);修改該檔案的檔案名稱為HelloWorld.cs,同時修改檔案中的namespace,和類名,如下:
namespace BruceZhang.com.FirstExample
{
///
/// Summary description for Class1.
///
class HelloWorld
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
//
// TODO: Add code to start application here
//
}
}
}
5、注意在HelloWorld.cs中,有一個Main()方法。這是因為我們建立的是控制台應用程式。在Main()方法中添加如下代碼:
Console.WriteLine(”Hello World!”);
Console.Read();
這裡的Console是一個能對控制台進行操作的類。
6、運行。
檢查儲存項目的路徑檔案夾FirstExample/bin/debug,已經存在了一個HelloWorld.exe檔案。
(二)為解決方案添加一個新項目
1、在“File”菜單中,選擇“Add Project”,添加“New Project”。在對話方塊中選擇“Class Library”,名字為Printer。至於儲存路徑,可以放在之前建立的FirstExample檔案夾下:
2、在Visual Studio右側,可以看到現在有兩個項目了。仍然修改新項目的名稱和預設命名空間名,均為BruceZhang.com.Printer。
3、將預設建立的Class1.cs改名為MessagePrinter.cs,同時修改其代碼為:
namespace BruceZhang.com.Printer
{
///
/// Summary description for Class1.
///
public class MessagePrinter
{
public MessagePrinter()
{
//
// TODO: Add constructor logic here
//
}
public static void Print(string msg)
{
Console.WriteLine(msg);
}
}
}
在MessagePrinter類中,我們注意到並沒有Main()方法,因為它不是應用程式。新增加的Print()方法,能夠接收一個字串,然後在控制台中顯示出來。
4、編譯Printer項目。滑鼠右鍵單擊該項目名,在菜單中選擇“Build”。成功編譯後,找到檔案夾Printer/bin/debug,可以發現有檔案BruceZhang.com.Printer.dll,這就是最後形成的組件檔。
5、關聯這兩個項目。我們希望是在FirstExample項目中用到Printer項目的Print()方法,前提是需要在FirstExample項目中添加對Printer項目的引用。按右鍵FirstExample項目的“Reference”,選擇“Add Reference”,在對話方塊中選擇“Project”標籤,找到該項目並選中,最後:
6、現在就可以在FirstExample項目中使用MessagePrinter了。首先,在命名空間中添加對它的使用(Using),然後再Main()方法中調用它,最後代碼如下:
using System;
using BruceZhang.com.Printer;
namespace BruceZhang.com.FirstExample
{
///
/// Summary description for Class1.
///
class HelloWorld
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
MessagePrinter.Print(”Hello World!”);
Console.Read();
}
}
}
7、運行。結果與前一個例子一樣。
在這個例子中,解決方案中就包含了兩個項目,一個是控制台應用程式,一個是類庫。類庫提供一些基本的功能,如例子中的Print()方法。我們常常把一些共用的方法,放到類庫中。這樣其他的應用程式就可以去調用它。例如本例的控制台應用程式。如果建立的Windows應用程式,也需要這個功能,就可以直接引用MessagePrinter的Print()方法,而不必重複去實現。