【问题标题】:Changing array values by assigning new array通过分配新数组来更改数组值
【发布时间】:2022-01-06 01:27:47
【问题描述】:

我有一个布尔数组

private bool[] example =  {false, false};

我使用一个函数更改它们,如果两个值都为真,该函数也返回真。

    private bool checkExample(bool firstCondition, bool secondCondition){
        example = new bool[]{firstCondition, secondCondition};
        return example.All(x => x);
    }

我担心这里的记忆。通过分配新数组来更改数组是否安全? new bool[]{firstCondition, secondCondition};

引擎盖下到底发生了什么?据我了解,由于它在函数内部,我们使用的是短期存储?还是因为我们使用了关键字new,所以我们使用的是长期存储?

我非常重视您的帮助。

示例用例:

checkExample(example[0], true); // and vice versa

【问题讨论】:

  • 你为什么要使用数组?为什么不只是return firstCondition && secondCondition;
  • @gabriel-luci 我需要将它们的状态保存在数组中,以便可以在许多可观察对象之间共享。这些 observables 没有直接相互连接。

标签: c# memory


【解决方案1】:

这里发生的事情非常简单。首先你需要意识到所有的数组(甚至是值类型的数组(比如bool)都是引用类型的实例。所以,当你说:

private bool[] example =  {false, false};

您正在做的是在您的类中创建一个字段,其中包含对bool 的单维数组的引用。由于您正在对其进行初始化,因此会创建并初始化数组,从而在托管堆上创建一个对象。

在你的方法中,你正在这样做:

example = new bool[]{firstCondition, secondCondition};

在该代码中,您指的是与您初始化时相同的 example 成员。该代码中发生的情况是,在 托管堆 上创建了一个新的 bool 数组并进行了初始化,并且您为 example 字段分配了对该新数组的引用。

此时,除非您将对该原始数组的引用分配给其他东西(长期存在的变量、字段或属性),否则原始数组不再具有对其的任何引用。一旦托管堆上的对象不再有任何对它的引用,它就会有资格进行垃圾回收

在未来的某个时候,垃圾收集器会过来“收集”内存。如果该数组存在的时间不长,那么它将被收集到 Gen0 集合中(这很便宜)。很有可能,它将被收集到 Gen1 或 Gen2 集合中(每个集合的成本更高)。

一般来说,您不必担心此类事情。托管(/垃圾收集)系统期望您的代码会产生垃圾。 .NET 中的分配非常便宜。为了提高垃圾收集(尤其是小对象)的效率,我们付出了很多努力。

【讨论】:

  • 如果您在另一个答案中遵循@Serge 的建议,您最终会得到基本相同的结果而不会产生任何垃圾。
【解决方案2】:

如果你因为某些其他原因不需要创建新数组,为什么不使用它

 private bool checkExample(bool firstCondition, bool secondCondition){
        example[0]=firstCondition; 
        example[1]= secondCondition;
        return example.All(x => x);
    }

【讨论】:

  • 好主意,谢谢
猜你喜欢
  • 1970-01-01
  • 2022-11-27
  • 2020-11-08
  • 1970-01-01
  • 2021-11-08
  • 1970-01-01
  • 2016-06-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多