最佳实践:ByRef还是ByVal?在.Net中是哪一个?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (8)

在ByRef和ByVal之间进行选择时需要考虑什么。

我理解这两者之间的差异,但我并不完全理解,如果ByRef节省资源,或者我们甚至需要在.Net环境中担心这一点。

如果功能在某种情况下无关紧要,你如何在两者之间做出决定?

提问于
用户回答回答于

这方面有很多错误信息。主要的是你了解值类型和引用类型之间差异,以及通过值和传递参考之间差异

你几乎总是想通过价值传递。按引用传递几乎总是用于“我想返回多个结果,而不仅仅是将事物添加到传入的列表中。” 使用传递引用的方法的经典示例是Int32.TryParse,其中返回值是成功/失败,并且分析的值由out参数“返回”。

用户回答回答于

所有类型的默认值都是byValue,但重要的是要理解这两个选项对于“引用类型”(类)而不是值类型的含义。(结构)。

对于引用类型,如果在方法中声明引用类型变量,则该变量是该方法的堆栈帧中的内存位置。它不在堆上。当初始化该变量(使用new或工厂,无论)时,那么你已经在堆上创建了一个实际对象,并且该对象的地址存储在方法栈帧中声明的引用变量中。

当将引用类型传递给另一个方法byVal时,将创建存储在调用方法堆栈中的地址的副本,并将该值的副本(指针地址)传递给被调用的方法,并将其存储在新的存储器中在被调用方法堆栈中的槽。在被调用的方法中,新的克隆变量直接指向堆上的同一个对象。所以使用它可以改变同一个对象的属性。但是你不能改变原始引用变量(在调用方法栈上)指向哪个堆对象。如果在我写的被调用的方法中

  myVar = new object();

调用方法中的原始变量不会更改为指向新对象。

如果我通过引用类型byRef,otoh,我将一个指针传递给调用方法堆栈中的声明变量(它包含一个指向堆上对象的指针),因此它是指向该对象的指针的指针。它指向调用方法堆栈上的内存位置,它指向堆上的对象。 所以,现在,如果我改变被调用方法中变量的值,通过将其设置为一个新对象(),如上所述,因为它是调用方法中变量的“参考”,所以我实际上正在改变哪个对象调用方法中的变量指向。所以在被调用的方法返回后,调用方法中的变量将不再指向堆上的同一原始对象。

扫码关注云+社区