代码之家  ›  专栏  ›  技术社区  ›  user5910494

使用集合和引用关键字[已关闭]

  •  0
  • user5910494  · 技术社区  · 9 年前

    我在看 MSDN 关于的页面 ref 关键字,并使用集合而不是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);    
    }
    

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

    更新:

    还有一个问题,我现在明白了 裁判 关键字和 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;     
    }
    
    2 回复  |  直到 9 年前
        1
  •  0
  •   radu-matei    9 年前

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

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

    Value Types

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

    值类型包括所有数值类型, bool 以及枚举和 structs 你定义自己。

    (值的主要类型是结构和枚举,因为数值和 布尔 实现为 struct ).

    请注意,您仍然可以 pass a value type by reference by using the ref keyword.

    Reference types

    当将引用类型作为参数传递时,该方法接收引用的副本,因此该方法将处理同一对象。所以 方法内部所做的任何修改都将持续。

    在C#中, string 有一种特殊的行为。它是 通过引用传递 并且是不可变的(如果修改 一串 对象,新值将复制到另一个对象中,旧变量将引用新值。)

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

    所以,在你的情况下,你通过了 List<int> 它是类的实例,因此通过引用传递。

    希望这能澄清一点。

    祝你好运!

    根据新问题更新

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

    • 当您将元素添加到列表(在方法中)时,您正在修改原始列表。
    • 当您返回相同的引用时,请执行以下操作:

    elements = Method(elements); 你实际分配 elements 从方法返回的列表( 这与您最初传递的相同,因为它是通过引用传递的)

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

        2
  •  0
  •   Davit Tvildiani    9 年前

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

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

    2) 值通过copy//传递。您可以在此处使用ref来防止这种行为

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

    列表是引用类型,它是整数的容器,所以如果容器是可变的,您可以对其进行可变。。。

    第二个问题 : 取决于你用那种方法做什么。。。

    1) 如果你以后想重用这个方法,那是个好主意

    2) 如果列表中有大量的代码行,那么可以使其更具描述性。请将它们作为具有描述性名称的方法进行区分,并按顺序调用它们,而不是在一个方法体中进行调用…(有点像释放眼睛和大脑的疲劳:)