7

我有一个 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 一起去吗?

4

4 回答 4

14

到运行时ref并且out是相当可互换的,因为它们都只是传递一个引用。但是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参数在进入方法之前不需要赋值,而必须在退出方法之前赋值。

相比之下,ByRef在 VB 中只提供.ref的附加语义,而不提供out. out在 VB 中没有等价物。

于 2011-08-08T09:02:17.810 回答
4

正如我的问答中提到的,您可以在参数定义上指定一个<Out()>属性,尽管 VB 会忽略它,但 C# 会正确处理参数。

于 2011-08-13T13:56:58.277 回答
2

在 VB中没有等价物out(据我所知)。只要ByRef是等价物,ref那将是正确的选择。

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

编辑:

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

于 2011-08-08T08:55:18.190 回答
2

一起去ref- 它是 VB 的 C# 等价物ByRef

但是请 阅读此详细说明:何时使用 ref vs out

于 2011-08-08T08:56:57.290 回答