2016-07-22 137 views
4

我有這樣的VB代碼C#替代VB代碼

Try 
    For i = 0 To OutData.NumMerids - 1 
     With OutData.MeridData(0) 
      .NumCurves = InStepFiveData.ConvexSurfaceData.MultiCurveData.NumOzCurves + InStepFiveData.ConvexSurfaceData.MultiCurveData.NumLenticularCurves 
      ReDim .CurveData(.NumCurves - 1) 
     End With 
    Next 
    ... 

我想產生類似的C#代碼。我使用了一些邏輯並且扣除了下面的代碼。

try 
{ 
    for (i = 0; i <= OutData.NumMerids - 1; i++) 
    { 
     // var _with25 = OutData.MeridData[0]; 
     OutData.MeridData[0].NumCurves =(short) (InStepFiveData.ConvexSurfaceData.MultiCurveData.NumOzCurves + InStepFiveData.ConvexSurfaceData.MultiCurveData.NumLenticularCurves); 
     // ERROR: Not supported in C#: ReDimStatement 
     Array.Resize(ref OutData.MeridData[0].CurveData, OutData.MeridData[0].NumCurves - 1); 
    } 
    ... 
} 

只想知道我做錯了什麼?

謝謝

+2

請考慮在代碼評論中發佈此內容。 http://codereview.stackexchange.com/ – Maverick

+0

請記住,雖然'Array.Resize'似乎只是調整你的數組的大小,它實際上創建一個副本在幕後有效地改變對你的數組的引用。在這種情況下,這意味着如果您以前將'OutData.MeridData [0] .CurveData'分配給某個其他變量,它將仍然指向一個未調整大小的數組。 – Ash

+1

不要在你的'Resize'調用中減1。 C#數組維度和大多數框架函數按*長度*工作,VB數組聲明按* bounds *工作。這通常意味着C#和VB之間涉及數組的相當的代碼,當其中至少有一個使用語言結構(而不​​是庫函數)時,需要將值調整一。 –

回答

2

錯誤在於Array.Resize語句;更具體地在給定的大小。

在VB.Net中,您給出了數組的最後一個索引,在C#中給出了數組的長度
所以在兩者之間有一個移位1。

ReDim .CurveData(.NumCurves - 1) 
' equivalent to 
ReDim .CurveData(0 To .NumCurves - 1) ' length is (.NumCurves - 1) - 0 + 1 = .NumCurves 

這來自於一個事實是,在VB6,你可以有一個數組中的其他基本比0(特別是號碼1集)索引,所以這是有效的(它不是在VB.Net

Dim someArray(-4 To 5) As Integer ' declares an array of 10 integer indexed from -4 to 5 

回到你的代碼只需要給大小

//Array.Resize(ref OutData.MeridData[0].CurveData, OutData.MeridData[0].NumCurves - 1); 
// replaced by 
Array.Resize(ref OutData.MeridData[0].CurveData, OutData.MeridData[0].NumCurves); 

至於Ashwin Nair給出的評論; ReDim具有相同的行爲(我也不會驚訝使用ReDim使用Array.Resize在內部.NET)

編輯:

戴維說,這是answer Array.Resize是Redim PreserveRedim翻譯(將數據抹去)

+0

so所以我需要它到處我看到數組聲明? – Apoorv

+0

@Apoorv很可能你會需要它爲每個數組聲明'Dim',調整'ReDim'或複製'ReDim Preserve';這與'for'循環的邏輯相同;在VB.Net中,你必須在C#中使用'bound - 1',你可以因爲嚴格的比較,而不是比較**或者等於** – Sehnsucht

+0

你在混淆'ReDim'和'ReDim Preserve'。 –

2

您(以及接受的答案)將'ReDim'和'ReDim Preserve'混淆在一起。你必須 -

OutData.MeridData[0].CurveData = new Foo[OutData.MeridData[0].NumCurves]; 

(該類型的「CurveData」是未知的我,所以我用「富」: 你「使用ReDim」語句只使用一個「新」的語句來創建數組轉換用適當的類型替換)。

1

你可以糾正/改善有幾件事情:

C#for循環要求你申報的循環變量。

for(var i = 0; i < 100; i++) {

這可能不是一個問題,如果你已經宣佈i以上的地方,但我會建議保持侷限於循環,如果可能的範圍迭代變量。

作爲替代VB的With我會使用局部變量。 (我相信這是With幕後的真實情況。)看起來你出於某種原因評論說。每當你參考OutData.MeridData[0]InStepFiveData.ConvexSurfaceData.MultiCurveData你必須尊重幾個對象,並根據這些對象的結構可能是低效的。另外它很難閱讀。

@Dave Doknjas得到Redim替代部分權利,你只需要使用一個構造函數。 Redim實際上拋出舊的數組並創建一個新的數組,因此它的名稱實際上有點誤導。至Redim Preserve您需要使用Array.Copy將舊數組中的值移至新數組。

try { 
    for (var i = 0; i <= OutData.NumMerids - 1; i++) { 
     var meridData = OutData.MeridData[0]; 
     var curveData = InStepFiveData.ConvexSurfaceData.MultiCurveData; 
     meridData.NumCurves = (short)(curveData.NumOzCurves + curveData.NumLenticularCurves); 
     meridData.CurveData = new Foo[meridData.NumCurves]; 
    } 
} 
+0

什麼使用,而不是Redim?我使用Array.Reize()。 – Apoorv

+1

.NET數組實際上不能調整大小,所以任何看起來像它的函數調整一個實際上是創建一個新的數組,並可能複製原始數組的內容。我會手動自己創建新的數組。 '新的MyClass [100]' – JamesFaix