| 場景 | VB.NET | C# |
|---|---|---|
| 嚴格模式 | Option Strict On(建議開啟) | 預設嚴格 |
| 基本型別轉換 | CInt(), CSng(), CStr() | (int), (float), (string) |
| 參考型別轉換 | CType(obj, Type) | (Type)obj |
| 後期繫結 | Option Strict Off 允許 | 需 dynamic 或反射 |
建議:移植前先在 VB 開啟 Option Strict On 修正所有轉換錯誤。
| C# | VB.NET | 備註 |
|---|---|---|
: (繼承/實作) | Inherits / Implements | |
abstract | MustInherit (類別) / MustOverride (成員) | |
sealed | NotInheritable (類別) / NotOverridable (成員) | |
virtual | Overridable | |
override | Overrides | |
new (隱藏) | Shadows | |
static | Shared | |
internal | Friend | |
protected internal | Protected Friend | |
ref | ByRef | |
params | ParamArray | |
unsafe/fixed | 無對應 | VB 不支援 |
// C# 委派變數指派
FuncType func = new FuncType(Method1);
func = Method2; // 方法群組轉換
func(args); // 呼叫
' VB 委派需 AddressOf
Dim func As New FuncType(AddressOf Method1)
func = AddressOf Method2
func.Invoke(args) ' 必須用 Invoke
// C# 動態訂閱/取消
obj.Event += Handler;
obj.Event -= Handler;
// VB 動態
AddHandler obj.Event, AddressOf Handler
RemoveHandler obj.Event, AddressOf Handler
' VB 靜態訂閱 (WithEvents + Handles) - 編譯期繫結,效能較好
Friend WithEvents obj As MyClass
Sub Handler(...) Handles obj.Event ... End Sub
移植策略:VB 靜態事件 → C# 動態訂閱(在建構子或 Load 中 +=)。
| 功能 | VB.NET | C# |
|---|---|---|
| 條件捕獲 | Catch When Err.Number = 52 | catch (Exception ex) when (ex.HResult == ...) (C# 6+) |
| 離開 Try 區塊 | Exit Try | goto __leave; + finally |
| 非結構化錯誤 | On Error GoTo / Resume | 不支援,需重構為 try-catch |
' VB Module = 全域共享成員
Module Utils
Public Function Add(a, b) ...
End Module
' 呼叫:Utils.Add(1,2)
// C# 等價:static class
public static class Utils {
public static int Add(int a, int b) ...
}
// 呼叫:Utils.Add(1,2) // 需類別名
' VB 顯式介面實作:成員可改名、改存取層級
Class C : Implements I
Sub DoIt() Implements I.Method1 ... End Sub
End Class
// C# 隱式實作:成員名稱必須匹配
class C : I {
public void Method1() { ... }
}
// C# 顯式實作(類似 VB)
class C : I {
void I.Method1() { ... } // 僅透過 I 介面可見
}
VB 不支援運算子多載 → 需轉為具名方法(Add, Subtract 等)。implicit/explicit 轉換運算子無法直接移植。
注意:工具轉換後必須人工審查,特別是事件、介面實作、泛型約束、擴充方法等細節。