VB.NET 遷移到 C# 時,`Array` 函數與 `UBound` 函數是常見的轉換難點。C# 無直接等價函數,需採用數組初始化器或 LINQ 實現同等功能。
VB.NET 原代碼場景
' VB.NET
Dim arr = Array("A", "B", "C") ' 創建數組
Dim upper = UBound(arr) ' 獲取最大索引 (返回 2)
' 等價於 arr.GetUpperBound(0)
C# 替換方案對比
1. Array 函數替換:創建數組
| VB.NET 寫法 | C# 替換方案 | 適用場景 |
|-------------|-------------|----------|
| `Array("A", "B", "C")` | `new[] { "A", "B", "C" }` | **最推薦**:編譯期類型推斷、語法簡潔 |
| `Array("A", "B", "C")` | `new string[] { "A", "B", "C" }` | 顯式指定類型 |
| `Split("A,B,C", ",")` | `"A,B,C".Split(',')` | 字符串分割生成數組 |
| `Array.CreateInstance(...)` | `Array.CreateInstance(typeof(string), 3)` | 動態類型/維度創建 (罕用) |
2. UBound 函數替換:獲取最大索引
| VB.NET 寫法 | C# 替換方案 | 說明 |
|-------------|-------------|------|
| `UBound(arr)` | `arr.Length - 1` | **一維數組標準寫法** |
| `UBound(arr, 1)` | `arr.GetUpperBound(0)` | 多維數組第 1 維 (C# 0-based) |
| `UBound(arr, 2)` | `arr.GetUpperBound(1)` | 多維數組第 2 維 |
| `arr.GetLength(0) - 1` | 等價於 `GetUpperBound(0)` | 另一種寫法 |
完整轉換示例
場景一:聲明並初始化
' VB
Dim names = Array("張三", "李四", "王五")
For i = 0 To UBound(names)
Debug.Print(names(i))
Next
// C#
var names = new[] { "張三", "李四", "王五" };
for (int i = 0; i < names.Length; i++) // 或 i <= names.Length - 1
{
Console.WriteLine(names[i]);
}
// 更現代:foreach
foreach (var name in names) Console.WriteLine(name);
場景二:動態添加元素 (VB Array 不定長特性)
' VB: Array 配合 ReDim Preserve 動態擴容
Dim dynArr() As String
ReDim Preserve dynArr(0)
dynArr(0) = "First"
ReDim Preserve dynArr(1)
dynArr(1) = "Second"
// C#: 使用 List 替代
var list = new List { "First" };
list.Add("Second");
var arr = list.ToArray(); // 需要數組時轉換
場景三:多維數組邊界
' VB: 多維數組
Dim matrix(2, 3) As Integer ' 0-2, 0-3
Dim u1 = UBound(matrix, 1) ' 返回 2
Dim u2 = UBound(matrix, 2) ' 返回 3
// C#: 多維數組
var matrix = new int[3, 4]; // [0-2, 0-3]
var u1 = matrix.GetUpperBound(0); // 2
var u2 = matrix.GetUpperBound(1); // 3
var len1 = matrix.GetLength(0); // 3
var len2 = matrix.GetLength(1); // 4
遷移核心對照表
| VB.NET 概念 | C# 對應 | 關鍵差異 |
|-------------|---------|----------|
| `Array(...)` | `new[] { ... }` | C# 無可變參數 Array 函數 |
| `UBound(arr)` | `arr.Length - 1` | C# 0-based 索引,Length 為長度 |
| `ReDim Preserve` | `List
.Add()` | C# 數組長度固定,用 List 動態擴容 |
| `LBound(arr)` | `0` (固定) | C# 數組索引固定從 0 開始 |
| `Split(str, ",")` | `str.Split(',')` | 實例方法 vs 共享方法 |
工具輔助遷移
- Telerik Code Converter:在線 VB↔C# 轉換
- SharpDevelop / ILSpy:反編譯 IL 對照
- Visual Studio:貼上 VB 代碼到 .cs 文件,IDE 會提示部分轉換
核心原則:VB 的 Array 改用 C# 數組初始化器;UBound 改用 Length - 1;動態數組改用 List<T>。掌握這三點,覆蓋 95% 遷移場景。