C#和VB.Net输出参数

C# and VB.Net out parameters

我有一个C中的项目,它利用了另一个用vb.net编写的项目。我现在可以修改这两个。

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

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

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

1
2
3
4
5
6
7
    public void CallOtherMethod()
    {
        string param1 ="test";
        string param2;

        provider.AddTransaction(param1, out param2);
    }

vb.net中的byref关键字不应该同时具有"ref"和"out"功能吗?

我应该和裁判一起去吗?


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

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

变成

1
2
.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


正如我的问答中提到的,您可以在参数定义上指定一个属性,尽管vb忽略了它,但c正确地处理参数。


使用ref,它是vb的ByRef的c等价物。

但是请阅读此详细说明:何时使用REF与OUT。


在vb(据我所知)中没有等同于out的东西,只有ByRef相当于ref才是正确的选择。

因为您将通过引用传递,所以被调用的函数将接收您的值,并且您需要将参数初始化,使其在内存中有一个地址。

编辑:

既然您可以同时编辑这两个文件,为什么不将Sub更改为Function并删除它呢?完全解决了这个问题,而且,我认为,让你的代码更好。