首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 與 VB.NET 程式碼互轉完整指南:語法對照、陷阱與最佳實務

     編輯:關於C語言

為何需要互轉?

  • 專案主力語言為 VB,需整合現有 C# 程式碼(或反之)
  • 雙語言學習:善用現有開源專案(如 Donkey.NET 僅有 VB 版)
  • 組件參考雖通用,但原始碼層面整合效率更高

核心差異對照表

1. Option Strict 與型別轉換

場景VB.NETC#
嚴格模式Option Strict On(建議開啟)預設嚴格
基本型別轉換CInt(), CSng(), CStr()(int), (float), (string)
參考型別轉換CType(obj, Type)(Type)obj
後期繫結Option Strict Off 允許需 dynamic 或反射

建議:移植前先在 VB 開啟 Option Strict On 修正所有轉換錯誤。

2. 修飾詞與關鍵字對照

C#VB.NET備註
: (繼承/實作)Inherits / Implements
abstractMustInherit (類別) / MustOverride (成員)
sealedNotInheritable (類別) / NotOverridable (成員)
virtualOverridable
overrideOverrides
new (隱藏)Shadows
staticShared
internalFriend
protected internalProtected Friend
refByRef
paramsParamArray
unsafe/fixed無對應VB 不支援

3. 委派與事件

// 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 中 +=)。

4. 例外處理

功能VB.NETC#
條件捕獲Catch When Err.Number = 52catch (Exception ex) when (ex.HResult == ...) (C# 6+)
離開 Try 區塊Exit Trygoto __leave; + finally
非結構化錯誤On Error GoTo / Resume不支援,需重構為 try-catch

5. 模組 vs 靜態類別

' 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)  // 需類別名

6. 介面實作

' 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 介面可見
}

7. 運算子多載

VB 不支援運算子多載 → 需轉為具名方法(Add, Subtract 等)。implicit/explicit 轉換運算子無法直接移植。

自動化工具建議

  • Telerik Code Converter:線上免費,雙向轉換
  • SharpDevelop / ILSpy:內建語言轉換(反編譯 IL → 目標語言)
  • Roslyn API:自建轉換管線

注意:工具轉換後必須人工審查,特別是事件、介面實作、泛型約束、擴充方法等細節。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved