2017-05-08 65 views
2

我正在用C#重新編寫一箇舊的VB應用程序,這個應用程序是某種計算器。所以它由一些子程序組成,這些子程序需要一些值,並計算一些新值(中間值結果),稍後將其用於其他一些計算中。從VB轉換爲C#,存儲子程序的值

他們這樣做的方式是這樣的:

int in = 4; 
Call routine(in, outFromRoutine1); 

Call routine2(outFromRoutine1, outFromRoutine2); 

在VB6默認爲按引用傳遞,所以我可以做同樣的在C#這樣的:

int in = 4; 
int outFromRoutine2 = 0; 
Routine(in, ref outFromRoutine1); 

int outFromRoutine2 = 0; 
Routine2(outFromRoutine1, ref outFromRoutine2); 

但我只是想,如果這被認爲是一個奇怪的方式來做到這一點在C#中?這只是某種奇怪的VB做法。 在C#中這樣做是否存在任何問題?

+1

功能比較正常。 '''var result = routine2(routine1(in))'''但不知道調用中的代碼,這可能不正確 –

+2

ByRef在VB6代碼中很常見,因爲它是默認的。所以你首先要確定的是它實際上*必須*通過ref,它通常不是。也可以考慮在VS2017中使用新的C#v7 goody,您可以編寫例程(in,out int outFromRoutine1),因此您不必聲明變量。 –

回答

3

C#同時提供ref(參數是輸入和輸出)和out(僅輸出參數),允許您將方法的參數用作方法的輸出。這就是說,一般來說,認爲最好的做法是使用返回語句來返回C#中的值。如果您正在使用visual studio 2017,您還可以使用C#的新功能,該功能允許您從單一方法返回多個值。

https://docs.microsoft.com/en-us/dotnet/articles/csharp/language-reference/keywords/method-parameters

+0

不知道爲什麼這已被投票。這對我來說是指向正確的做事方式(移動應用程序以傳回值而不是通過參考來修改變量)。Out也是一個很好的觀點,我認爲C#應該被一個清楚的新手考慮。好的做法,如果你要堅持「VB方式」 –

+0

謝謝!我不知道新的C#功能,也沒有關於使用out。 – Balle

0

雖然上述圖案可以在VB6,VB.net或C#來實現,它不是在它們中的任何慣用的。所有3種語言都認識到返回價值的方法與沒有價值的方法之間的區別,鼓勵人們使用適當的方法。

儘管VB6默認使用了byref,但您仍然會發現大多數使用的代碼函數返回值而不是subs。在.net(包括VB和C#)中,ref和out vars通常用於初始化資源或返回多個值。由於支持命名元組,因此返回多個值很快就會變得不那麼常見。