C#和VB.Net输出参数

时间:2011-08-08 08:50:01

标签: c# vb.net parameters out

我在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”的功能?

我应该选择参考吗?

4 个答案:

答案 0 :(得分:14)

对于运行时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

答案 1 :(得分:4)

正如我在question and answer中提到的那样,可以在参数定义中指定<Out()> attibute,虽然VB忽略了它,但C#正确处理了该参数。

答案 2 :(得分:2)

VB中没有等效的out(据我所知)。ByRef只相当于ref,因此这是正确的选择。

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

编辑:

由于您可以同时修改这两者,为什么不将Sub更改为Function并摆脱 这个问题完全和IMO一样,使你的代码更好。

答案 3 :(得分:2)

使用ref - 它是VB的ByRef的C#等价物。

<强> BUT 请阅读详细说明:When to use ref vs out