【问题标题】:Does assigning an non-empty array to another array clear the array?将非空数组分配给另一个数组是否会清除数组?
【发布时间】:2014-02-24 12:42:21
【问题描述】:

假设我有数组,

        string[] arr1 = { "Hi", "hello", "goodbye" };
        string[] arr2 = { "Stop", "making", "arrays", "please" };
        string[] arr3 = { "Simple", "Array"};

根据上面的声明arr1被初始化为大小3,arr2为4,而arr3只有2。现在arr1已经被初始化为一个最大大小为3的数组,如果我分配一个不同的数组会发生什么它?

  • 原始值是否被清除并替换为新数组?
  • 如果第二个数组较小,是否只填充较小数组之前的值并保留旧值?
  • 如果它更大,我会得到 IndexOutOfRange 异常吗?

【问题讨论】:

  • 反对者!由于我在 SO 上找不到答案,所以我添加了这个问题。这是作为问答发布的。我自己回答了这个问题。

标签: c# arrays variable-assignment


【解决方案1】:

代码中的三个变量只是对内存中System.Array 实例的引用。将不同的System.Array 实例分配给变量将更改该变量的引用。如果没有其他对象引用它,原始的 System.Array 实例将被标记为垃圾回收。

string[] arr1 = { "Hi", "hello", "goodbye" };
string[] arr2 = { "Stop", "making", "arrays", "please" };
string[] arr3 = { "Simple", "Array"};

arr1 = { "A", "new", "array" }; // The original "Hi", "hello", "goodbye" array will be marked for garbage collection; arr1 now references the new array

我建议阅读引用类型和垃圾收集。 MSDN 文档应该充分解释这些概念。

【讨论】:

    【解决方案2】:

    变量是指向数组的指针。通过将arr2 分配给arr1arr1arr2 都指向{ "Stop", "making", "arrays", "please" }。如果您将“测试”分配给arr1[1]arr2[1] == "test"。分配给 arr1 的原始数组是孤立的,将在某个时候被垃圾回收。

    【讨论】:

      【解决方案3】:

      所以,我试了一下。

              foreach (var item in arr1)
              {
                  Console.WriteLine("arr1:);   
                  Console.WriteLine(" " + item);
              }
      
              arr1 = arr2;
              foreach (var item in arr1)
              {
                  Console.WriteLine("arr1 = arr2:); 
                  Console.WriteLine(" " + item);               
              }
      
              arr1 = arr3;
              foreach (var item in arr1)
              {
                  Console.WriteLine("arr1 = arr3:); 
                  Console.WriteLine(" " + item);
              }
      

      输出是

      arr1: 
       Hi 
       hello 
       goodbye 
      arr1 = arr2:
       Stop 
       making 
       arrays 
       please 
      arr1 = arr3
       Simple 
       array
      

      所以我们看到,当一个数组被分配给另一个数组时,第一个数组只是指向与分配器相同的引用(如果分配器更改,则分配的更改相同,请尝试)。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-11-27
        • 1970-01-01
        • 2018-09-03
        • 2014-07-14
        • 2018-08-22
        • 2017-01-29
        相关资源
        最近更新 更多