C#技术问询:多Stagiaire对象共享同一Notes数组的问题排查
问题原因与解决方案
这是因为数组是引用类型导致的问题!在C#里,数组、类这类引用类型的变量,存储的是数据在内存中的地址,而不是数据本身。当你把同一个notes数组传递给三个Stagiaire对象时,它们的内部实际指向的是内存中同一个数组实例——所以不管哪个对象修改这组Notes,另外两个都会同步变化,看起来就像是共享了同一组数据。
解决方法
方法1:创建数组副本后再传递给对象
每次实例化Stagiaire时,不要直接传原数组,而是传它的副本。可以用数组的Clone()方法(注意需要强制类型转换):
// 输入notes的代码保持不变 Stagiaire stg1 = new Stagiaire(compteur++, "karami", "loubna", "TDI", (double[])notes.Clone()); Stagiaire stg2 = new Stagiaire(compteur++, "Jamal", "Youssef", "TDI", (double[])notes.Clone()); Stagiaire stg3 = new Stagiaire(compteur++, "Ilham", "Fayrouz", "TRI", (double[])notes.Clone());
Clone()会创建一个新的数组实例,把原数组的元素复制进去,这样每个Stagiaire拿到的都是独立的数组。
方法2:在Stagiaire构造函数内部处理副本(更推荐)
把复制数组的逻辑放到Stagiaire类的构造函数里,这样调用方不用每次手动处理,代码更健壮,也能避免后续忘记复制导致的问题:
public class Stagiaire { private int _id; private string _nom; private string _prenom; private string _classe; private double[] _notes; public Stagiaire(int id, string nom, string prenom, string classe, double[] notes) { _id = id; _nom = nom; _prenom = prenom; _classe = classe; // 在这里创建传入数组的副本,确保每个实例拥有独立的Notes _notes = (double[])notes.Clone(); } // 你的其他属性或方法... }
这样不管调用方传入什么数组,每个Stagiaire对象都会自动创建自己的Notes副本,从根源上解决共享问题。
额外小建议
如果你的Notes数量可能动态变化,也可以考虑用List<double>替代数组,复制起来更直观:
// 构造函数里可以写成: _notesList = new List<double>(notes);
内容的提问来源于stack exchange,提问作者camille
相关产品推荐
相关产品推荐

