使用集合和 Ref 关键字

Using Collections and Ref Keyword

我正在阅读有关 ref 关键字的 MSDN 页面,并使用集合而不是 int 修改示例,如下所示:

public static void Main(string[] args)
{
    List<int> elements = new List<int>();
    Method(elements);               

    foreach(int val in elements)
    {
        Console.WriteLine(val);
    }
 }

static void Method(List<int> addelements)
{
        addelements.Add(1);
        addelements.Add(20);    
}

为什么没有 ref 关键字我可以在方法之外看到添加到集合中的整数?当它只是 int val 时,我需要参考来查看方法所做的更改,但是 List<int> 不是这样,这是为什么?

更新:

还有一个问题,我现在理解了ref关键字和Lists。考虑到这一点,正在做以下多余的事情:

public static void Main(string[] args)
{
    List<int> elements = new List<int>();
    elements = Method(elements);                

    foreach(int val in elements)
    {
        Console.WriteLine(val);
    }
 }

static List<int> Method(List<int> addelements)
{
        addelements.Add(1);
        addelements.Add(20);
        return addelements;     
}

在c#中有引用类型和值类型两种对象。 (不安全情况下的指针类型) 传入函数时:

1) Refs 通过引用传递 // 不需要 ref

2) 值通过副本传递 // 你可以在这里使用 ref 来防止这种行为

static void Method(List<int> addelements)  // list is referance type

列表是引用类型,它是整数的容器,所以如果容器是可变的,你可以改变它...

第二个问题: 取决于您在该方法中所做的事情...

1) 如果您想以后重用该方法,那将是个好主意

2) 如果您在该列表上有大量代码行,您可以使其更具描述性,将它们作为具有描述性名称的方法分开并按顺序调用它们,而不是在一个方法体中执行... (有点释放眼睛和大脑的压力:))

C#中有两种类型:引用类型和值类型(还有一种pointer type,但只用于不安全的上下文)

值类型直接包含值,而引用类型包含对数据的引用。

Value Types

当将值类型的变量作为参数传递时,该方法接收原始对象的副本,因此在该方法内部所做的任何修改都会不坚持。

值类型由所有数值类型组成,bool和枚举以及structs您自己定义。

(值的主要类型是结构和枚举,因为数值和 bool 被实现为 struct)。

Note that you can still pass a value type by reference by using the ref keyword.

Reference types

将引用类型作为参数传递时,该方法会收到引用的副本,因此该方法将使用同一个对象。因此 在方法内部所做的任何修改都将保留。

In C#, string has a special behavior. It is passed by reference and is immutable (it cannot be modified - if you modify a string object, the new value is copied into another object and your old variable references your new value.)

每个用户定义的class、接口和委托都是通过引用传递的。 此外,每个数组都是通过引用传递的。

因此,在您的情况下,您传递了一个 List<int>,它是 class 的一个实例,因此它是通过引用传递的。

希望这能澄清一些事情。

祝你好运!

根据新问题更新

正如@fafase所说,你在那里做了两件事:

  • 当您向列表添加元素时(在方法中),您正在修改原始列表。
  • 当你return相同的引用时,所以当你这样做时:

elements = Method(elements); 您实际上从方法中将 elements 分配给您 return 的列表( 这与您首先传递的相同,因为它是通过引用传递的)

简而言之,如果您只需要修改列表,只需在 void 方法中进行,就像在原始问题中一样。