在C#中是否有一种方法可以强制将参数按值传递而不是引用,就像在VB中一样?

6
刚刚回答了一个关于使用括号调用VB6方法的问题,我记得你可以强制将ByRef参数值传递为ByVal。查询后,我发现这在VB.NET中仍然有效。
然而,在C#中,我找不到类似的解决方案。去年,我不得不引用许多没有充分理由要求传入ByRef的VB.NET类库(相信我,我已经检查过了)。这迫使我将对象属性设置为本地变量以便传递它们。虽然不是很严重,但如果你问我,这并不是很干净的做法。
我想知道是否有语法解决方案我不知道的情况。
以下是我当前模式的示例,我希望避免这种模式:
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参数传递为ByVal。请参阅此VB.NET功能的MSDN文档。 http://msdn.microsoft.com/en-us/library/chy4288y.aspx


如果方法尝试修改属性,该属性会发生什么?我不太理解这在VB.NET中应该如何工作... - Cameron
3
我有所怀疑,这听起来像是一个愚蠢的向后兼容性问题,在VB.NET中可用。 - Kevin DiTraglia
@TyCobb:所以对象是在后台被复制的?这个复制是如何进行的? - Cameron
@Cameron 我猜它是在幕后被复制的。具体是如何实现的,我不确定。 - TyCobb
7
这只是将一个值分配给临时变量,就像发布的 C# 代码一样 - VB 所做的就是分配给一个隐藏的临时变量。 - Dave Doknjas
显示剩余4条评论
1个回答

5

你需要明确地将值复制到一个新变量中,并通过引用传递新变量,就像你在问题中展示的那样。在C#中没有语法糖可以让编译器代表你执行这个复制操作,就像VB中所做的那样。


很遗憾,我真的希望能学到一个新技巧。好吧,这就解释了为什么我无法在任何地方找到答案。谢谢。 - TyCobb
在 VB 代码中没有奇异的“复制”操作 - 只是对隐藏临时变量的普通赋值。 - Dave Doknjas
2
@EricJ.:但请记住,所有的 VB 做的只是对一个隐藏的本地变量进行赋值——最好的 C# 等效方法并不复杂,只是对一个可见的本地变量进行赋值。 - Dave Doknjas
2
@EricJ。这是变量值的复制。在这种情况下,变量的值是对对象的引用,因此将创建引用的副本。如果对象是一个值类型,则其值将是实际值,在这种情况下将制作的副本。 - Servy
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接