【问题标题】:C# and VB.Net out parametersC# 和 VB.Net 输出参数
【发布时间】:2011-10-22 05:16:53
【问题描述】:

我有一个 c# 项目,它正在使用另一个用 vb.net 编写的项目。我目前可以同时修改两者。

我在 VB 项目中有一个方法,例如:

    Public Sub MethodName(ByVal param1 As String, ByRef param2 As String)
        param2 = param1 + 1
    End Sub

我无法使用 C# 中的 out 关键字调用此方法:

    public void CallOtherMethod()
    {
        string param1 ="test";
        string param2;

        provider.AddTransaction(param1, out param2);
    }

VB.Net中的ByRef关键字不应该同时具有“ref”和“out”的能力吗?

我应该只使用 ref 吗?

【问题讨论】:

  • 我的猜测是 outref 相同,但多了一个属性,而 ByRef 只是 ref
  • 一个 ref 参数需要初始化,但我不需要也没有任何用处。我并不是真的问这个,因为我被卡住了,我可以很容易地使用 ref。

标签: c# vb.net parameters out


【解决方案1】:

对于运行时refout 是相当可互换的,因为它们都只是传递一个引用。 然而out 在 IL 中以附加属性为前缀:

public void y(ref int a)
public void z(out int a)

变成

.method public hidebysig instance void  y(int32& a)
.method public hidebysig instance void  z([out] int32& a)

这使得C#编译器能够区分这两者并且添加了out所具有的特殊语义,即out参数在进入方法之前不需要赋值并且必须在退出方法之前赋值。

相比之下,VB 中的ByRef 只提供ref,而不提供out 的附加语义。在 VB 中,它不等同于 out

【讨论】:

    【解决方案2】:

    正如我在question and answer 中提到的,您可以在参数定义中指定<Out()> attibute,尽管 VB 会忽略它,但 C# 会正确处理参数。

    【讨论】:

      【解决方案3】:

      VB 中没有 out 的等价物(据我所知)。只有ByRef 等价于ref,所以这是正确的选择。

      由于您将通过引用传递,因此被调用函数将接收您的值,您需要初始化您的参数,以便它在内存中有一个地址。

      编辑:

      既然您可以同时编辑两者,为什么不将Sub 更改为Function 并摆脱 完全解决问题,IMO,让你的代码也更好。

      【讨论】:

      • 我的实际项目中需要返回的参数不止一个。我问这个问题只是为了学习,而不是为我的项目提供解决方案。我会和参考一起去。干杯。
      • 你可以返回一个类或结构。只是一个想法。
      【解决方案4】:

      使用 ref - 它是 VB 的 ByRef 的 C# 等效项。

      但是 阅读此详细说明:When to use ref vs out

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-16
        • 1970-01-01
        • 2018-02-19
        • 2015-01-16
        • 2017-08-07
        • 1970-01-01
        相关资源
        最近更新 更多