Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C语言中数组的初始化_C# - Fatal编程技术网

C# C语言中数组的初始化

C# C语言中数组的初始化,c#,C#,我想问一些基本的问题,我想答案似乎是我无法回答的。在下面的代码中,我试图加载一个带有csv文件的数组;分隔,其中包含两列字符串名称,int Score。 为了简单起见,我已经注释掉了我想要用来将这个文件传输到数组中的循环,我只是加载了第二个元素。出于某种原因,除非我使用scoreobj[1]=新的HighScore;我得到一个空引用。 我为什么要这么做?我还没有在开始时初始化scoreobj[]对象吗 using System; using System.IO; using System.Col

我想问一些基本的问题,我想答案似乎是我无法回答的。在下面的代码中,我试图加载一个带有csv文件的数组;分隔,其中包含两列字符串名称,int Score。 为了简单起见,我已经注释掉了我想要用来将这个文件传输到数组中的循环,我只是加载了第二个元素。出于某种原因,除非我使用scoreobj[1]=新的HighScore;我得到一个空引用。 我为什么要这么做?我还没有在开始时初始化scoreobj[]对象吗

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类的一个实例吗?数组只是一个集合,可以存储一组特定类型的元素。仅仅因为你有一个袋子并不意味着里面有土豆,是吗?当然你得去市场放些土豆进去。