本文譯自 http://www.mightywords.com/browse/details_bc05.jsp?privateLabel=true&sku=MW8NN0&etailerId=1063
Visual Basic.NET 是 Visual Basic--但不是你以前所熟悉的 Visual Basic
這表示每一個 VB6 的開發者要成為一個熟練的 Visual Basic.NET 將會有一段不算平滑的學習曲線。因為新的語法與觀念,以及 .NET 架構上的 Class 都需要去了解。這引發的一個疑問
”既然我無論如何都需要學一個新語言,哪我為何不學新的 C#”
在回答這個問題之前,讓我先提供 Visual Basic 與 C++ 程式設計師另外一個問題
”C# 是一個全新的語言,既然要全新的 C# 那為何不學 VB.NET”
第一個問題其實潛藏了一個想法,當 VB6 的程式設計師問到”為何我不學習 C# 來取代 VB.NET”時,他實際代表的意義是:
”我可以用 VB 做很多不錯的程式設計,但 C++ 的程式設計師卻仍然瞧不起我。他們賺更多的錢,他們都說 VB 是玩具語言 -- VB 不如 C++ 的速度與能力。他們一再強調 C++ 可以做到但 VB 做不到的部分。現在,所有的 C++ 程式設計師都被告知 C# 是 .NET 環境中最好的語言,而 C# 也的確非常像 C++ 或 Java。既然我在學 VB.NET 時需要花費很多心力,那為何不將這些努力放在 C# 上,讓我今後可以成為真正的程式設計師,可以含他們一樣賺更多的錢。”
在討論真正的主題時,我們需要先釐清以下的觀念:
- VB.NET 是完全與 CLS ( common language spec)相容,也就是說它可以完全發揮 .NET 執行環境的能力。
- C# 提供少數在 VB.NET 無法辦到的特色,但這些特色對絕大多數的 VB 程式設計師來說是沒有用的。
- 兩個語言都與 CLS 相容,也就是說你在極少數的狀況下需要 C# 的特色,也可以在 VB.NET 專案中利用這些 C# 程式碼。
如果你接受這些觀念,則很明顯的 VB 程式設計師應該不再在 C++ 或 C# 的程式設計師的面前感到自卑。
VB.NET 與 C# 一樣好,甚至在某些方面更好
你應該考慮真正符合經濟效益的語言
符合經濟效益?
是的,如果兩個語言如此的相似,那決定的因子應該是經濟效益。
在評估語言時的經濟效益因子
當一個專業的軟體開發人員你應該尋找最經濟的軟體開發解決方案。在這個前提下,你應該考慮軟體專案整個開發週期的成本,也就是在你心中應該有以下的考量因素
- 學習需要時間且花成本
- 在同一時間使用多種語言需要心智上的位移,讓部分的程式設計師會降低開發效率(困擾多於成本的考量)
- 在開發時期撰寫正確的程式碼比在其它任何時期校正程式碼﹔在成本上都比較便宜
- 長遠來說容易讀以及了解的程式碼在除錯與維護的成本上較便宜
讓我們就以這幾點來討論
學習需要時間且花成本
基本上我假定 VB 的程式設計師學 VB.NET,C++ 的程式設計師學 C# 比較快。VB 的程式設計師基本上在 VB.NET 只要注意一些細節上的差異,如整數變成 32 位元,參數傳遞預設是 ByVal 而不再是 ByRef 等等。但我相信 VB6 的程式設計師熟悉 VB.NET 的語法會快過 C# 的語法。
在同一時間使用多種語言需要心智上的位移
以我個人的經驗我常常在 VB 寫 C++ 程式碼,在 C++ 寫 VB 的程式碼。
在開發時期撰寫正確的程式碼比在其它任何時期校正程式碼﹔在成本上都比較便宜
哪一個語言可以讓你較容易完成無錯誤的程式碼?哪一個語言在撰寫與編譯時期可以抓出最多的錯誤。你將會發現 VB.NET 和 C# 在這方面是非常相似的。
長遠來說容易讀以及了解的程式碼在除錯與維護的成本上較便宜
在後面的文章將會更進一步說明此點
讓我們開始比較
在以下的文章我們將逐項比較 VB.NET 和 C#。需要強調的是這裡做的是兩個語言差異上的比較,而不是表列兩個語言的特色,所以兩個語言共有的特色或不需比較的,在本文中不會出現。
資料和變數
VB.NET 支援所有的 CLS 標準資料型態,C# 增加支援無正負號的資料型態。下表列出兩個語言的基礎型態以及是否與 CLS 相容
VB.NET
C#
與 CLS 相容
Object
object
Y
String
string
Y
sbyte
N
Short
short
Y
Integer
int
Y
Long
long
Y
Byte
byte
Y
ushort
N
uint
N
ulong
N
Single
float
Y
Double
double
Y
Boolean
bool
Y
Char
char
Y
Decimal
decimal
Y
第一眼看起來 C# 贏得這一項,但真正重要的是贏得這一項應該考慮與 CLS 相容。
當你的元件與 CLS 相容時,就可以百分之百保證任何其他與 CLS 相容的語言都可以存取元件的方法、屬性都沒有問題。也保證其他的 CLS 相容語言都可以實做你所定義的介面,繼承你的 Classes。也同時保證其他與 CLS 相容的工具可以使用這個元件。
換句話說,CLS 相容是 .NET 的基礎。C# 可以使用無符號的變數,但應該在應用程式的內部使用。你應該在定義 structures、方法、和屬性等等會出現在 assembly 的內容時避免使用.
VB 的程式設計師會希望使用無符號型態是因為需要呼叫 Win32 API,但 .NET 大幅降低了 Win32 API 的重要性,且透過 .NET 的 interop system 會自動 marshalling 有符號與無符號之間的資料。
判決:若不考慮與 CLS 相容,C# 在這個主題上獲勝,反之則 VB.NET 獲勝,因為除了違反 CLS 的相容性外,使用不相容的無符號變數會有潛在資料轉換的錯誤,以及因為增加了複雜性而以長遠來看會提升維護成本。
Shift 運算子
C# 提供與 C 和 C++ 相似的 left-shift 和 right-shift(<< 和 >>)運算子。對 VB 程式程式設計師來說這是公認少用的需要,因為他們比較專注商業應用程式,但我個人希望微軟將它們加到 VB.NET
判決:C++ 在這種少用的運算子上獲勝
Operator Overloading
C# 支援 Operator Overloading,讓 +、-、* 等等運算子可以在定義新的資料型態後,重新定義運算子對這些型態的意義。
Operator Overloading 往往被程式設計師高估了。有一個傾向是一些 C++ 的程式設計師會定義一些 class 使用的 overloaded 運算子,但卻沒有任何意義。你應該在很直觀的情境下使用 overloaded 運算子,否則要開發者去記憶某些運算子的特有意義是強人所難。當然,為複數 overloading "+" 是來做向量加法是一個不錯的例子。
VB.NET(至少 Beta1)並不支援 Operator Overloading。
當與 CLS 相容的語言如 VB.NET 嘗試要使用有 overloaded operators 的 Class 時會發生什麼狀況呢?在 VB.NET 這個運算子是不能用的,但你可以利用 overloaded 函數如 op_Addition 或 op_Subtraction 來做同樣的事。
大部分的 VB 程式設計師都不需要 operator overloading。C# 程式設計師若要建立其他語言使用的 assemblies 也要避免使用 operator overloading,取而代之的是利用簡單易懂的函數。
判決:C# 贏得這個主題,尤其對於某些在科學領域的程式設計師尤其重要,但這個特點對 VB 程式設計師來說毫不重要
變數初始化和 local scoping
VB.NET 自動將所有的變數初始化成 0 或 nothing。C# 在你未初始化變數之前不准你用該變數。在大多數的狀況下這不成問題,但因為 VB.NET 只有在建立時初始化變數,所以會有一些微小的狀況。以下列 C# 程式而言
int x;
for(x=1;x<3;x++)
{
int i=0;
Console.WriteLine(i);
i++;
}
會連續出現兩個 0,但若以同樣的 VB.NET
Dim x As Integer
For x = 1 To 2
Dim i As Integer
Console.WriteLine(i)
i += 1
Next
則會出現 0 和 1,當然若你以下列的語法
Dim i As Integer = 0
會出現兩個 0
判決:C# 小贏
型別轉換支援(Conversion Support)
VB.NET 不支援從一個結構型別定義自訂型別轉換到另外一個。取而代之的是要以特別命名的方法來完成這個動作。以下的程式碼表列出你可以
public struct SomeStruct
{
public int x;
public static explicit operator string(SomeStruct s)
{
//故意讓 (string) 的結果不同,做自訂轉換的動作
return s.x.ToString()+10.ToString();
}
public override string ToString()
{
return((string)this);
}
}
public class Class1
{
public static int Main(string[] args)
{
string ResultString;
SomeStruct s;
s.x=5;
ResultString=( string)s;
Console.WriteLine(ResultString);
Console.WriteLine(s.ToString());
return 0;
}
}
為何仍然要 Override ToString 方法?因為這種自訂型別轉換並不與 CLS 相容,CLS 允許自訂型別轉換,但需要以正確的 ToXXX 或 FromXXX 的格式建立方法,讓不支援 C# 格式的其他語言可以執行轉換。
判決:在不考慮與 CLS 相容下,C# 小贏。我希望微軟會將這項功能加入到 VB.NET
函數語法
VB.NET 和 C# 在函數呼叫的方法上有許多不同
函數回傳值
VB.NET 維持原先若函數不提供回傳值便自行回傳 0 或 Nothing(若回傳字串,則等於 Null 字串)。C# 要求每一個可以離開的程式執行路徑一定要有明確的回傳語法。因此 C# 編譯器在你沒有提供需要的回傳值時會警告你。
判決:C# 提供了明顯的好處在函數編譯的第一時間幫忙解決潛在的回傳值錯誤
選擇性參數(Optional parameters)
C# 不提供函數選擇性參數,但仍可以利用會獲得相同結果的 overloading,所以不算大輸。
判決:VB.NET 提供以一個函數做到多個函數才能做的 overloading 而贏得這一項
模組(Modules)和靜態(Static)成員(Members)
C# 所有的程式碼都要存放在 Class,VB.NET 持續支援標準模組。定義在標準模組的函數和變數會在 assembly 中以 global 的方式呈現。標準模組是與 CLS 相容的,C# 無法定義這一點。
C# 和 VB.NET 都在 Class 支援靜態方法、屬性和 fields(在 VB.NET 稱為 Shared)。它們在使用時不需真正建立物件,例如
class AClass
{
public static void StaticMethod()
{
Console.WriteLine("不需要建立物件就可以呼叫");
}
}
則呼叫 StaticMethod 只需要
AClass.StaticMethod();
在 C# 呼叫靜態方法只能透過 type 名稱,在 VB.NET 則同時可以利用 type 名稱或是物件的 instance 來呼叫,範例如下
Class AClass
Public Shared Sub ShareMethod()
Console.WriteLine("可以不建立物件來呼叫函數")
End[1] [2] [3] [4] 下一页 [Web开发]VS2005+SQL2005之.NET2.0数据库连接 [Web开发]VS2008和.NET3.5Beta2新特性(介绍及下载地址) [Web开发]通过VS2005如何发布网站 [Web开发]VS2005安装了SP1后发布项目存在的问题之解决方案 [Web开发]VS2005如何建立(新建)网站项目 [Web开发]图文解说—如何通过VS2005测试网站程序性能 [系统软件]M$ Expression VS MM Studio [常用软件]GB VS Maxthon之群组功能 群组 [VB.NET程序]定制VB.NET控件编程之拦截击键动作 [VB.NET程序]VB.NET 中调用浏览目录对话框
|