通过分配新数组更改数组值
Changing array values by assigning new array
我有一个布尔数组
private bool[] example = {false, false};
我使用一个函数更改它们,如果两个值都为真,该函数也 returns 为真。
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
这里发生的事情很简单。首先,您需要意识到所有数组(甚至是值类型的数组(如 bool
)都是引用类型的实例。因此,当您说:
private bool[] example = {false, false};
您正在做的是在 class 中创建一个字段,其中包含对 bool
的单维数组的引用。由于您正在初始化它,因此创建并初始化了数组,在托管堆上创建了一个对象。
在你的方法中,你正在这样做:
example = new bool[]{firstCondition, secondCondition};
在该代码中,您指的是与初始化相同的 example
成员。该代码中发生的事情是在 托管堆 上创建并初始化了一个新的 bool 数组,并且您正在为 example
字段分配对该新数组的引用。
此时,除非您将对该原始数组的引用分配给其他内容(长期变量、字段或 属性),否则原始数组不再有任何引用。一旦托管堆上的对象不再有任何引用,它就会符合垃圾收集条件。
在未来的某个时候,垃圾收集器会过来“收集”内存。如果阵列没有存在很长时间,那么它将被收集在 Gen0 集合中(非常便宜)。很有可能,它会被收集到 Gen1 或 Gen2 集合中(每个都花费更多)。
一般来说,您不必担心这样的事情。托管(/垃圾收集)系统期望您的代码会产生垃圾。 .NET 中的分配非常便宜。为了提高垃圾回收(尤其是小对象)的效率,我们付出了很多努力。
如果您出于其他原因不需要创建新数组,为什么不使用它
private bool checkExample(bool firstCondition, bool secondCondition){
example[0]=firstCondition;
example[1]= secondCondition;
return example.All(x => x);
}
我有一个布尔数组
private bool[] example = {false, false};
我使用一个函数更改它们,如果两个值都为真,该函数也 returns 为真。
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
这里发生的事情很简单。首先,您需要意识到所有数组(甚至是值类型的数组(如 bool
)都是引用类型的实例。因此,当您说:
private bool[] example = {false, false};
您正在做的是在 class 中创建一个字段,其中包含对 bool
的单维数组的引用。由于您正在初始化它,因此创建并初始化了数组,在托管堆上创建了一个对象。
在你的方法中,你正在这样做:
example = new bool[]{firstCondition, secondCondition};
在该代码中,您指的是与初始化相同的 example
成员。该代码中发生的事情是在 托管堆 上创建并初始化了一个新的 bool 数组,并且您正在为 example
字段分配对该新数组的引用。
此时,除非您将对该原始数组的引用分配给其他内容(长期变量、字段或 属性),否则原始数组不再有任何引用。一旦托管堆上的对象不再有任何引用,它就会符合垃圾收集条件。
在未来的某个时候,垃圾收集器会过来“收集”内存。如果阵列没有存在很长时间,那么它将被收集在 Gen0 集合中(非常便宜)。很有可能,它会被收集到 Gen1 或 Gen2 集合中(每个都花费更多)。
一般来说,您不必担心这样的事情。托管(/垃圾收集)系统期望您的代码会产生垃圾。 .NET 中的分配非常便宜。为了提高垃圾回收(尤其是小对象)的效率,我们付出了很多努力。
如果您出于其他原因不需要创建新数组,为什么不使用它
private bool checkExample(bool firstCondition, bool secondCondition){
example[0]=firstCondition;
example[1]= secondCondition;
return example.All(x => x);
}