2017-05-08 15 views
2

私は古いVBアプリケーションをC#で書き直していますが、このアプリケーションはある種の電卓です。したがって、いくつかの値をとるいくつかのサブルーチンで構成され、いくつかの新しい値(中間結果)が計算されます。これは後で他の計算で使用されます。VBからC#への変換、サブルーチンからの値の格納

、彼らがこれを行う方法は、このようなものです:VB6でのデフォルトは参照渡しですので、私はこのようなC#で同じことを行うことができ

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

Call routine2(outFromRoutine1, outFromRoutine2); 

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#で値を返すためには、return文を使用するのがベストプラクティスと見なされます。ビジュアルスタジオ2017で前進する場合は、C#の新しい機能を使用して、単一のメソッドから複数の値を返すこともできます。

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

+0

これがなぜ投票されなかったのか分かりません。これは私にとっては正しいことを指しています(変数をrefで変更するのではなく、値を返すようにアプリを動かすこと)。Outはまた、C#に明白に新しい人が考えるべき良いポイントです。 "VB Way"に固執しようとしているなら、良い練習です。 –

+0

ありがとう!私は新しいC#の機能について知りませんでした。 – Balle

0

上記パターンは、VB6、VB.netまたはC#で実装することができるが、それはそれらのいずれかにおいて慣用ではありません。 3つの言語すべてが、価値を返す方法とそうでない方法の区別を認識し、人々は適切な方法を使用することを推奨します。

VB6はデフォルトでbyrefになっていますが、関数のほとんどがsubsではなく値を返す関数を使用しています。

.net(VBとC#の両方)では、refおよびout変数は、通常、リソースを初期化するか、複数の値を返すために適切に使用されます。名前付きタプルのサポートにより、複数の値を返すことは間に合わないことがあります。