【发布时间】:2020-11-29 17:09:00
【问题描述】:
我试图了解在 c# 中通过 ref 传递方法参数而不是通过值传递参数有什么好处。
我有一个自定义对象列表(大约 50k),我需要对其属性运行一些操作。我编写了一个计算类,它接受 50K 元素的列表并返回值。我想知道如果我通过引用传递参数,它是否会在运行时保存我的系统内存,因为我正在传递引用而不是传递 50k 列表的副本? .NET 实际上是如何维护这一点的?
main(){
var itemList={}//list containing 50k items
var result=Calculate(itemList);// it passes a copy of the array
var resultByRef=Calculate(ref itemList); //**it passes address of result variable, is it going to take less memory in runtime??**
}
private int Calculate(List<CustomClass> itemList){
//do some calculation
return result;
}
private int CalculateByRef(ref List<CustomClass> itemList){
//do some calculation
return result;
}
【问题讨论】:
-
即使没有
ref,也不会复制,因为List<>是reference type。 -
首先要了解
value type和reference type的区别;然后去看看关于这两种广泛类型的“by ref”传递之间的区别。当您“通过 ref”传递值类型时,这允许您更改值,并且该更改将在原始变量中的方法回调之外看到。当您“通过 ref”传递引用类型时,这真正意味着您可以将新对象分配给该变量,并且外部的原始变量也将指向新对象。 “通过 ref”传递引用类型并不常见。 -
Ref 关键字主要用于原始类型(int,float,etx..),因为 c# 中的所有对象都通过引用传递
-
如果你使用 Parallel.For 等,你会发现循环内的代码不能通过 ref 变量传递给循环内调用的函数。
标签: c#