C#和VB.NET是微軟公司開發的.NET框架中,两种面向对象的编程语言,分別衍生自C++語言及Visual Basic,因此在語法,註解方式都有許多的差異。
C#和VB.NET各自有其不同的歷史,在語法上也有很大的差異。C#語法的基礎是衍生自1970年代丹尼斯·里奇在貝爾實驗室(AT&T)發展的C語言[1],其中也包括了完全物件導向的C++,許多Java語言語法的基礎也是來自C++語言[2],這也是C#和Java有許多相近之處的原因。
VB.NET是來自1960年代的BASIC語言,是「Beginner's All-purpose Symbolic Instruction Code」的縮寫,一開始BASIC在學校中教授,而且如它的名字所述的,被視為是一個基礎的程式語言。1970年代微電腦的製造商將BASIC用來做電腦系統的程式語言,以及有簡單輸入輸出控制的半作業系統。1980年代微軟也開始使用將一此語言,1990年代發展為Visual basic,用在window系統的快速應用程式開發[3],Visual basic打敗了當時像PowerBuilder等快速應用程式開發工具[4]。雖然Visual Basic如此的成功,但在2000年代初期微軟提出.NET框架及對應的Visual Studio開發平台,而Visual Basic也在第六版(VB6)畫下句點。
雖然C#和VB.NET在語法上有相當的不同,但因為都是微軟開發的.NET框架下的程式語言,而且是由同一個開發團隊進行開發、管理及維護,因此會有不少的共通點[5]。C#和VB.NET會編譯為同一種中介語言,在同一種.NET框架下的執行期函式庫下執行[6]。C#和VB.NET在語言結構上有一些差異,差異主要都是語法上的差異,但不要使用微軟提供,方便和VB6轉換的相容性函式庫,幾乎每一個VB.NET中的指令都有對應的C#的指令,反之亦然。為了延伸其機能,兩種語言也參考同一個.NET框架下的基礎類別。因此大多數用其中一個語言寫的程式可以用語法轉換程式轉換為另一種語言,只有少數例外,而已有許多開源軟體及商業軟體有這類的功能。
从技术角度来看,C#和VB.NET之间的大部分差异都是语法糖。也就是说,大多数特性都存在于两种语言,但有些任务在一种语言中比另一种语言更容易完成。
WithEvents
结构声明变量。此结构令程序员可以从“类名”下拉列表中选择一个对象,然后从“声明”下拉列表中选择一个方法以自动插入方法签名。Handles
语法,它将事件处理程序连接到对象变量而不是对象。RaiseEvent
关键字引发事件,IDE在此关键字后会显示可用的事件列表。RaiseEvent
隐式检查事件处理程序是否为Nothing。(在C#中引发事件在语法上与调用过程完全相同,并且需要额外的代码行来检查有线事件处理程序)With ... End With
结构内,点操作符前可不写出对象名。#12/31/2000#
Module
语句(虽然C#的静态类更容易理解,但静态类里每个成员都必须显示声明为static
。)My
命名空间[10]dynamic
关键字提供了相同的便利。#Const
指令定义条件编译器常量。#Const
常量一般在#If
语句中使用。ByRef
)传入方法。在C#里属性必须先赋值给局部变量,再传入。Case
语句可接不等式,如Select x: Case Is >= 3
。 (在C#里必须用if ... else
实现。)Overloads
关键字修饰。(C#中缺少此关键字可能会导致意外重载)Like
运算符支持模式比较。(C#只能访问Microsoft.VisualBasic.CompilerServices.LikeOperator.LikeString
方法)Return
语句可省略。也可向当前方法赋值来设置返回值。vbCrLf
、vbTab
。out
关键字。MyClass
关键字的行为类似于引用最初实现的类的当前实例。MyClass
类似于Me
,但是对它的所有方法调用都被视为方法被NotOverridable修饰。MyBase.New
用来调用父类的构造函数。End
语句直接终止程序。Dim x = Function(n As Integer) n + 1
checked
、unchecked
关键字进行精细控制。for(int i = 0; i < 10 && somethingTrue; i++)
。??
返回第一个非null值(如null ?? null ?? 1
返回1
)。unsafe
环境使用指针?
: someThingTrueOrFalse ? whenTrue() : whenFalse();
=
。C#用不同的符号:==
和=
,这允许在条件语句中先赋值,再比较。Option Strict
未打开时),VB.NET将尽可能强制转换该值。这种自动强制转换有时会导致意想不到的结果,比如Dim i As Integer = "1" '编译器插入一个从String到Integer的转换方法Dim j As String = 1 '编译器插入一个从Integer到String的转换方法If i = j Then '编译器插入一个从String到double的转换方法 MsgBox("Avoid using, but this message will appear!")End If
为了向后兼容,Option Strict
的默认值是关闭,但微软建议将其开启[12][13]
Val()
的参数可以是null。a=b=c
。以下是兩種語言的HelloWorld:
VB.NET
Imports SystemModule HelloWorldApp ' VB.NET Console 主程序 Sub Main() ' 輸出 Hello World! 至 Console Console.WriteLine("Hello World!") ' ReadKey 用來暫停避免直接關閉 Console 視窗 Console.ReadKey() End SubEnd Module
C#
using System;namespace HelloWorldApp{ class Program { // C# Console 主程序 static void Main(string[] args) { // 輸出 Hello World! 至 Console Console.WriteLine("Hello World"); // ReadKey 用來暫停避免直接關閉 Console 視窗 Console.ReadKey(); } }}