我在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”的功能?
我应该选择参考吗?
答案 0 :(得分: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
参数之前不需要具有指定值输入方法并在退出方法之前必须分配一个值。
相比之下,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。