首页 > 解决方案 > 如何解决对象被覆盖的问题?

问题描述

当我创建一些学生、科目并尝试为任何科目的特定学生添加成绩时,所有学生在该科目上都有该成绩,为什么会发生这种情况?我试图将它们分开,因为我需要一个学生科目的每个年级都与众不同,但我不明白我做错了什么。

class Student
{
    string name;
    string surname;
    int studentID;
    public List<Subject> subjectList = new List<Subject>();
}

class Subject 
{ 
    string name;
    int subjectID;
    public List<int> grades = new List<int>();
}

标签: c#classoop

解决方案


C# 类是引用类型,这意味着从类实例化的对象实际上是对位于堆上的对象的引用。

很久以前,当我开始使用类时,这个问题就发生在我身上。最后我发现我没有很好地实例化类。

您没有显示代码来修复和解释您的代码,但我确信您的问题是由于错误地重新使用对同一对象的引用。

例如,下面是重用相同对象引用的示例。中的所有对象都List<MyClass>将具有值,9因为myClass指向内存中的单个对象,而不是实例化 9 个实例MyClass

MyClass myClass = new MyClass();
List<MyClass> allClasses = new List<MyClass>();
for(int i =0 ; i < 10 ; i++)
{
   myClass.Value = i;
   allClasses.add(myClass);
}
public class MyClass{public int Value =0 ;}

但正确的是,在下面,我们使用对这些对象的引用来实例化新对象,而不是使用指向堆上的单个分配

List<MyClass> allClasses = new List<MyClass>();
for(int i =0 ; i < 10 ; i++)
{
   MyClass myClass = new MyClass();
   myClass.Value = i;
   allClasses.add(myClass);
}
public class MyClass{public int Value =0 ;}

希望我是清楚和正确的。

在此处阅读有关引用类型的更多信息


推荐阅读