Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/271.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
C# 如何';do';C中的ByVal#_C#_Vb.net_Byref_Byval - Fatal编程技术网

C# 如何';do';C中的ByVal#

C# 如何';do';C中的ByVal#,c#,vb.net,byref,byval,C#,Vb.net,Byref,Byval,据我所知,C#通过引用将参数传递给方法。在VB.NET中,您可以使用ByVal和ByRef来指定它。默认值为ByVal 这是为了与Visual Basic 6.0兼容,还是仅仅是随机的?另外,如何指定在C#中使用什么?我有点喜欢按值传递参数的想法。默认情况下,C#中的参数是按“ByVal”传递的。如果需要不同的行为,必须指定“ref”或“out”。默认情况下,C#中的参数是按值传递的。没有任何修饰符可以明确说明这一点,但是如果添加ref/out则该参数是通过引用实现的 这里常见的混淆是以下两者之

据我所知,C#通过引用将参数传递给方法。在VB.NET中,您可以使用ByVal和ByRef来指定它。默认值为ByVal

这是为了与Visual Basic 6.0兼容,还是仅仅是随机的?另外,如何指定在C#中使用什么?我有点喜欢按值传递参数的想法。

默认情况下,C#中的参数是按“ByVal”传递的。如果需要不同的行为,必须指定“ref”或“out”。

默认情况下,C#中的参数是按值传递的。没有任何修饰符可以明确说明这一点,但是如果添加
ref
/
out
则该参数是通过引用实现的

这里常见的混淆是以下两者之间的区别:

  • 按值传递值类型(对值类型的更改对调用方不可见,但理想情况下,值类型无论如何都应该是不可变的)
  • 通过引用传递值类型(对值类型的更改对调用方是可见的,但值类型在理想情况下无论如何都应该是不可变的-这非常重要,我要重复两次;p)
  • 按值传递引用(对ref类型的字段/属性的更改对调用方可见,但将ref类型重新指定给新的/不同的对象不可见)
  • 逐个引用传递引用(对字段/属性的更改以及重新分配引用对调用方可见)

按值传递是C#中的默认值。但是,如果所传递的变量是引用类型,则您是按值传递引用。这也许是你困惑的根源


基本上,如果您通过值传递引用,那么您可以更改它引用的对象,这些更改将在方法之外持续存在,但是您不能使变量引用其他对象,并使更改在方法之外持续存在。

有关默认值等的详细信息,请参阅。回答不错,Jon,但您也是AI!在vb6中,在没有
ByVal
关键字的情况下,参数作为
ByRef
传递。在.net语言中,默认值为“按值”。为了便于迁移并避免混淆,vb.net要求显式标记参数
ByRef
ByVal
,但VS编辑器将通过添加“ByVal”来“自动更正”没有此类标记的参数。因为从来没有任何C#ish语言将pass-by-ref作为默认行为,所以简单地说未标记的参数是pass-by-value是没有问题的。感谢@supercat提供历史记录/上下文。我一直想知道为什么我必须明确地声明
ByVal
,而我99%的时候都是这个意思。总是觉得这有点傻——知道为什么会让人觉得不那么傻;)@JeffBridgman:我觉得有点讽刺的是,虽然VB/QBasic中传递参数的默认byref行为早就被认为是一个错误,但VB6和C#中的闭包都是“默认”通过引用完成的[按值指定的唯一方法是创建新变量供闭包使用]。Java只允许按值,并要求声明封闭变量
final
;我的偏好是要求封闭变量要么标记为
只读
[相当于
最终
],要么明确声明为可通过引用捕获,但我没有设计语言。Marc Gravell在我打字时将基本相同的信息编辑到了他的答案中,我想这个答案有点多余。你的答案仍然有一些价值,因为它直接解决了修改引用和修改实例之间的区别。此外,最好不要将自己与排名为50+k的“人”相比:我有充分的证据表明,Reed是谷歌运营的人工智能,而其他大多数人也是非人类的。:-)谢谢,这正是造成我困惑的原因。当我第一次开始的时候,我到处都使用
ref
,因为我认为这相当于传递一个指针;