C# C语言中数组的初始化
我想问一些基本的问题,我想答案似乎是我无法回答的。在下面的代码中,我试图加载一个带有csv文件的数组;分隔,其中包含两列字符串名称,int Score。 为了简单起见,我已经注释掉了我想要用来将这个文件传输到数组中的循环,我只是加载了第二个元素。出于某种原因,除非我使用scoreobj[1]=新的HighScore;我得到一个空引用。 我为什么要这么做?我还没有在开始时初始化scoreobj[]对象吗C# C语言中数组的初始化,c#,C#,我想问一些基本的问题,我想答案似乎是我无法回答的。在下面的代码中,我试图加载一个带有csv文件的数组;分隔,其中包含两列字符串名称,int Score。 为了简单起见,我已经注释掉了我想要用来将这个文件传输到数组中的循环,我只是加载了第二个元素。出于某种原因,除非我使用scoreobj[1]=新的HighScore;我得到一个空引用。 我为什么要这么做?我还没有在开始时初始化scoreobj[]对象吗 using System; using System.IO; using System.Col
using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace WindowsFormsApp1
{
public class HighScore
{
public string Name { get; set; }
public int Score { get; set; }
public static void LoadHighScores(string filename)
{
string[] scoredata = File.ReadAllLines("C:/Users/User/Desktop/Test.csv");
HighScore[] scoreobj = new HighScore[scoredata.Length];
scoreobj[1] = new HighScore();
scoreobj[1].Name = scoredata[1].Split(';')[0];
//for (int index = 0; index < scoredata.Length; index++)
//{
// scoreobj[index].Name = scoredata[index].Split(',')[0];
// scoreobj[index].Score = Convert.ToInt32(scoredata[index].Split(';')[1]);
//}
Console.WriteLine(scoreobj[1].Name);
}
}
}
因为仅仅声明一个特定大小的索引不会创建任何HighScore类型的元素,。相反,你只需要保留一些记忆。换句话说:仅仅因为你有一个袋子,就不会在里面放任何土豆。你得自己去市场把土豆放进包里 您甚至可以创建派生类的实例并将其放入完全相同的数组中。在这种情况下,编译器如何知道要实例化哪个类
class Foo { ... }
class Bar { ... }
var array = new Foo[3]; // how would anyone know if you want three Foo-instances or 3 Bar-instances? or a mix?
编译器无法知道要实例化的类型,因此不会创建这些实例。因此,您必须自己创建实例
但即使没有派生类,构造函数也可能有编译器猜不到的参数:
class HighScore
{
public HighScore(string name, int score) { ... }
}
var array = new HighScore[3]; // how to set the parameters for the instances???
这就是为什么您的对象不包含任何实例,而只包含类型的默认值,对于引用类型,该值为null HighScore[]scoreobj=新的HighScore[scoredata.Length];创建指定长度scoredata.length的数组,但不包含任何对象
您需要在每个索引处分配一个对象,具体操作如下:
for (int i = 0; i < scoredata.Length; i++)
{
scoreobj[i] = new HighScore();
scoreobj[i].Name = scoredata[i].Split(';')[0];
}
因为仅仅声明一个特定大小的索引不会创建任何HighScore类型的元素。您甚至可以创建派生类的实例并将其放入完全相同的数组中。在这种情况下,编译器如何知道要实例化哪个类?它不能,因此也不会。因此,您必须自己创建实例。但是,即使没有派生类,您的构造函数也可能有编译器猜不到的参数,例如新的HighScorename、score。这个答案准确地描述了您经历这种行为的原因:我还没有在开始时初始化scoreobj[]对象……是的,您已经初始化了。但这只是初始化数组,它不会初始化内容,至少不超过为它们设置一些默认值,对于类等,这些默认值总是空的。请耐心听我说……过去几个月我一直在尝试OOP。。。。我确实意识到我已经用空值初始化了对象scoreobj,并且在内存中保留了一个位置。这不意味着我已经创建了Highscore类的一个实例吗?数组只是一个集合,可以存储一组特定类型的元素。仅仅因为你有一个袋子并不意味着里面有土豆,是吗?当然你得去市场放些土豆进去。