c# - 在 C# 中,通过 ref 传递值有什么好处?
问题描述
我试图了解在 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;
}
解决方案
看起来你像我一样来自 C++ 背景。
在 C# 中,每个对象都被传递,但它的引用一直在传递,这意味着无论对象有多大,您总是将其引用传递给方法。
关键字的唯一区别ref
是让您能够更改该引用本身。让我们通过一个例子来理解:
static void callByRef(ref byte[] buff)
{
buff[0] = 10;
buff = new byte[5];
}
static void callNormally(byte[] buff)
{
buff[0] = 10;
buff = new byte[5];
}
static void Main(string[] args)
{
byte[] param = new byte[5];
param[0] = 5;
Console.WriteLine("Original param.Hash: " + param.GetHashCode());
callNormally(param);
Console.WriteLine("param[0]: " + param[0]);
Console.WriteLine("param.Hash: " + param.GetHashCode());
callByRef(ref param);
Console.WriteLine("param[0]: " + param[0]);
Console.WriteLine("param.Hash: " + param.GetHashCode());
return;
}
输出如下:
Origenal param.Hash: 58225482
param[0]: 10
param.Hash: 58225482
param[0]: 0
param.Hash: 54267293
在正常调用中,您也可以更改对象内部的内容,但在ref
调用的情况下可以更改对象本身。
在您的情况下,您只担心内存复制,以防将大数据作为参数传递给 C++ 中发生的方法。在 C# 中,情况并非如此。