c# - 如何解决对象被覆盖的问题?
问题描述
当我创建一些学生、科目并尝试为任何科目的特定学生添加成绩时,所有学生在该科目上都有该成绩,为什么会发生这种情况?我试图将它们分开,因为我需要一个学生科目的每个年级都与众不同,但我不明白我做错了什么。
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# 类是引用类型,这意味着从类实例化的对象实际上是对位于堆上的对象的引用。
很久以前,当我开始使用类时,这个问题就发生在我身上。最后我发现我没有很好地实例化类。
您没有显示代码来修复和解释您的代码,但我确信您的问题是由于错误地重新使用对同一对象的引用。
例如,下面是重用相同对象引用的示例。中的所有对象都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 ;}
希望我是清楚和正确的。
在此处阅读有关引用类型的更多信息
推荐阅读
- c++ - 即使在写入 printf("...") 后也没有收到输出
- matplotlib - 在 Debian 9 上安装基于 python 的软件包的规则
- php - 在 Woocommerce 中使用表单添加自定义支付网关
- button - 我将 Xamarin.Forms 用于跨平台项目,我需要为我的 Google 登录按钮使用 Google drawables 九补丁图像
- git - 非交互式方式来压缩一系列不从 HEAD 开始的 git 提交
- python - Python在没有日期时间库的情况下添加日期
- spring-security - Spring SAML 默认确认 URL | 调整
- c# - 使用 linq C# 仅在同一天和 23:59 附近将记录获取到记录中
- javascript - 从字符串中切出单词
- java - 将工件上传到 gitlab maven 存储库