Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有一种方法可以像在VB中那样,在C#中强制参数按值传递而不是按ref传递?_C#_Vb.net - Fatal编程技术网

有没有一种方法可以像在VB中那样,在C#中强制参数按值传递而不是按ref传递?

有没有一种方法可以像在VB中那样,在C#中强制参数按值传递而不是按ref传递?,c#,vb.net,C#,Vb.net,刚刚回答了一个关于用括号调用VB6方法的问题,我记得您可以强制传递ByRef参数值ByVal。通过研究,我发现这在VB.NET中仍然有效 然而,我在C#中找不到任何类似的东西来支持这一点。在过去的一年里,我不得不引用很多VB.NET类库,这些类库毫无理由地采用了ByRef(相信我,我检查过)。这迫使我将对象的属性设置为局部变量,以便传入它们。不是大问题,但如果你问我的话,不是很干净 我想知道是否有一个我不知道的句法解决方案 作为我想要避免的当前模式的一个例子: var tempSomeObjec

刚刚回答了一个关于用括号调用VB6方法的问题,我记得您可以强制传递
ByRef
参数值
ByVal
。通过研究,我发现这在VB.NET中仍然有效

然而,我在C#中找不到任何类似的东西来支持这一点。在过去的一年里,我不得不引用很多VB.NET类库,这些类库毫无理由地采用了
ByRef
(相信我,我检查过)。这迫使我将对象的属性设置为局部变量,以便传入它们。不是大问题,但如果你问我的话,不是很干净

我想知道是否有一个我不知道的句法解决方案

作为我想要避免的当前模式的一个例子:

var tempSomeObject = BarObject.FooProperty;
SomeVb6BusinessLogicMethod(ref tempSomeObject);
// Continue to do work and set other temp objects due to ref constraint
在VB6和VB.NET中,只需执行以下操作,即可对ByRef参数强制执行ByVal

SomeVb6BusinessLogicMethod((BarObject.FooProperty)) 'Note the extra parens
编辑:我不是在问ByRef和ByVal之间的区别。我在问C#是否有类似的方法强制ByRef参数为pass ByVal。请参阅此VB.NET功能的MSDN文档。

您需要显式地将值复制到新变量,并通过引用传入新变量,如您在问题中所示。C#中没有语法糖允许编译器像在VB中那样代表您执行此副本。

在C#中,param type决定是否正确?如果方法尝试修改属性,属性会发生什么变化?我不太明白这在VB.NET中是如何工作的…不知怎么的,我怀疑它,听起来像是一个愚蠢的向后兼容性的东西,它在VB中是可用的。NET@Cameron它的工作原理就像是
ByVal
。基本上,它只是在方法内部修改,外部属性没有修改。@Cameron:它只是一个临时赋值,就像C#代码发布一样-VB所做的只是赋值给一个隐藏的临时.Lame。我真的希望我能学会一个新把戏。哦,好吧。这就是为什么我在任何地方都找不到答案的原因。谢谢。@TyCobb刚刚想起C#6.0在这方面有一个相关的新功能,尽管这不是一个特别大的改进。声明表达式最近被搁置:@EricJ.:但请记住VB所做的只是对一个隐藏的局部变量赋值-最好的C#等价物并不复杂,这只是对一个可见局部变量的赋值。@EricJ。它是变量值的副本。在这种情况下,变量的值是对对象的引用,因此将创建引用的副本。如果对象是值类型,那么它的值将是实际值,在这种情况下,将创建该值的副本。