You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:08:51