这两种方法有什么区别

本文关键字:什么 区别 方法 两种 | 更新日期: 2023-09-27 17:59:51

下面的代码有什么区别?两种方法都实现了从列表中删除4的相同输出。

static void Main(string[] args)
{
    var list = new List<int> {1, 2, 3, 4, 5, 6, 7, 8, 9};
    ModifyList(ref list);
    Console.WriteLine(string.Join(", ", list));
    list.Add(4);
    ModifyList(list);
    Console.WriteLine(string.Join(", ", list));
    Console.ReadLine();
}
public static void ModifyList(ref List<int> list)
{
     list.Remove(4);
}
public static void ModifyList(List<int> list)
{
     list.Remove(4);
}

这两种方法有什么区别

在这种情况下,两者做的事情完全相同。通过ref传入参数的区别在于,如果您为变量本身赋值(例如list = new List<int>();),它将更新调用方的引用,以指向新列表。

有关更多信息,请参阅传递引用类型参数(C#编程指南)。

在这种情况下,唯一的区别是隐藏的,不容易察觉,区别在于在ModifyList(ref List<int> list)中,列表对象是通过引用传递的,因此原始引用(托管指针)与传递的原始对象相同,而在第二种情况下,引用被复制到另一个引用,因此列表参数基本上是指向真实对象的另一个参考的引用。

你得到的结果是一样的,因为在C#中,使用安全引用对你来说是完全透明的,但如果你使用带有原始指针的C或C++,你会注意到在第二种情况下,你必须两次取消引用指针才能访问对象。。。