在ByRef和ByVal之间进行选择时,需要考虑哪些事项。
我理解这两者之间的区别,但我不完全理解ByRef是否节省了资源,或者我们是否需要在.Net环境中担心这一点。
如果功能在某种情况下无关紧要,你如何在两者之间做出决定?
发布于 2008-11-14 14:28:02
关于这一点有很多错误的信息。最重要的是你理解了difference between value types and reference types和difference between pass by value and pass by reference。
您几乎总是希望通过值传递。通过引用传递几乎总是为了“我想返回多个结果,而不仅仅是通过向传入的列表中添加内容”。使用按引用传递的方法的经典示例是Int32.TryParse,其中返回值是成功/失败,解析后的值由out参数“返回”。
发布于 2008-11-14 14:41:21
对于所有类型,缺省值都是byValue,但是理解这两个选项对于“引用类型”(类)与值类型的含义是很重要的。(结构)。
对于引用类型,如果在方法中声明引用类型变量,则该变量是方法堆栈帧中的内存位置。它不在堆上。当您初始化该变量(使用new或工厂等)时,您已经在堆上创建了一个实际的对象,并且该对象的地址存储在方法堆栈帧中声明的引用变量中。
当您将引用类型传递给另一个方法byVal时,您正在创建存储在调用方法堆栈中的地址的副本,并将该值的副本(指针地址)传递给被调用的方法,在那里它被存储在被调用方法堆栈的新内存槽中。在被调用的方法内部,新克隆的变量直接指向Heap上的同一对象。因此,使用它可以更改同一对象的属性。但您不能更改原始引用变量(在调用方法堆栈上)指向哪个堆对象。如果,在被调用的方法中我写道
myVar = new object();
调用方法中的原始变量不会更改为指向新对象。
如果我传递一个引用类型byRef,otoh,我将传递一个指向调用方法堆栈中已声明变量的指针(它包含指向堆上对象的指针),因此它是指向对象指针的指针。它指向调用方法堆栈上的内存位置,该位置指向堆上的对象。
因此,现在,如果我更改被调用方法中变量的值,通过将其设置为一个新的object(),如上所述,因为它是调用方法中的变量的“引用”,所以我实际上是在更改调用方法中的变量所指向的对象。因此,在被调用的方法返回后,调用方法中的变量将不再指向堆上的同一原始对象。
发布于 2008-11-14 14:15:00
ByVal应该是你的“默认值”。除非您有使用ByRef的特殊原因,否则请使用它
https://stackoverflow.com/questions/290189
复制相似问题