首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >最佳实践: ByRef还是ByVal?在.Net中

最佳实践: ByRef还是ByVal?在.Net中
EN

Stack Overflow用户
提问于 2008-11-14 14:12:21
回答 7查看 17.9K关注 0票数 18

在ByRef和ByVal之间进行选择时,需要考虑哪些事项。

我理解这两者之间的区别,但我不完全理解ByRef是否节省了资源,或者我们是否需要在.Net环境中担心这一点。

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

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2008-11-14 14:28:02

关于这一点有很多错误的信息。最重要的是你理解了difference between value types and reference typesdifference between pass by value and pass by reference

您几乎总是希望通过值传递。通过引用传递几乎总是为了“我想返回多个结果,而不仅仅是通过向传入的列表中添加内容”。使用按引用传递的方法的经典示例是Int32.TryParse,其中返回值是成功/失败,解析后的值由out参数“返回”。

票数 34
EN

Stack Overflow用户

发布于 2008-11-14 14:41:21

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

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

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

代码语言:javascript
复制
  myVar = new object();

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

如果我传递一个引用类型byRef,otoh,我将传递一个指向调用方法堆栈中已声明变量的指针(它包含指向堆上对象的指针),因此它是指向对象指针的指针。它指向调用方法堆栈上的内存位置,该位置指向堆上的对象。

因此,现在,如果我更改被调用方法中变量的值,通过将其设置为一个新的object(),如上所述,因为它是调用方法中的变量的“引用”,所以我实际上是在更改调用方法中的变量所指向的对象。因此,在被调用的方法返回后,调用方法中的变量将不再指向堆上的同一原始对象。

票数 15
EN

Stack Overflow用户

发布于 2008-11-14 14:15:00

ByVal应该是你的“默认值”。除非您有使用ByRef的特殊原因,否则请使用它

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/290189

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档