从 VB 转换为 C#,存储子例程中的值

Converting from VB to C#, storing values from subroutines

我正在用 C# 重写一个旧的 VB 应用程序,这个应用程序是某种计算器。所以它由一堆子程序组成,这些子程序接受一些值,并计算一些新值(中间结果),这些值稍后用于其他一些计算。

他们的做法是这样的:

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# 中这样做也有问题吗?

C# 提供 ref(参数是输入和输出)和 out(参数仅是输出),允许您将方法的参数用作方法的输出。也就是说,一般来说,在 C# 中将 return 语句用于 return 值被认为是最佳实践。如果您正在使用 visual studio 2017,您还可以使用 C# 的新功能,它允许您从一个方法中 return 多个值。

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

虽然上述模式可以在 VB6、VB.net 或 C# 中实现,但在其中任何一个中都不是惯用的。所有 3 种语言都承认 return 有价值的方法和没有价值的方法之间的区别,并且鼓励人们使用适当的方法。

虽然 VB6 确实默认为 byref,但您仍然会发现大多数代码使用函数来 return 值而不是 subs。

在 .net(VB 和 C#)中,ref 和 out 变量通常被适当地用于初始化资源或 return 多个值。由于支持命名元组,返回多个值可能很快就会变得不那么常见。