首页 > 解决方案 > 在 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++ 背景。

在 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# 中,情况并非如此。


推荐阅读