初始化新字符串数组时引用为 空 [duplicate]

Null reference when initializing new string array [duplicate]

提问人:noobCoder 提问时间:4/14/2022 最后编辑:Theodor ZouliasnoobCoder 更新时间:4/14/2022 访问量:589

问:

我正在尝试创建 2 个数组,这些数组将是每个团队的字符串数组。

我创建了这个类

public class MyTeamWeapons
{
     public string[] weapons;
}

 public class MyLoadout
 {
     public MyTeamWeapons[] teamWeapons;
     public string[] playerModel;
 }

然后,我尝试创建一个实例并初始化长度为 5 的数组,填充将虚拟数据。

 loadout = new MyLoadout();
 loadout.teamWeapons = new MyTeamWeapons[2];
 loadout.teamWeapons[0].weapons = new string[5] {"hellosd", "yous", "ds", "ad", 
"dd"};

我得到:

NullReferenceException:对象引用未设置为对象的实例

尝试初始化 5 的新字符串数组时。我不明白为什么。我想要的只是 2 个团队,每个团队都有一系列字符串来保存武器名称。

任何帮助都会很棒,谢谢!

C# 数组 NullReferenceException

评论

0赞 Onurkan Bakırcı 4/14/2022
你如何实例化?loadout
0赞 noobCoder 4/14/2022
对不起,更新了问题
1赞 Aloso 4/14/2022
new MyTeamWeapons[2]创建一个数组,其中每个值都是 。null

答:

0赞 Reza Heidari 4/14/2022 #1

获取意味着您错过了我认为与 相关的对象的实例化。NullReferenceException: Object reference not set to an instance of an objectloadout

列表 (List) 比其他数据结构更受青睐,因为它们能够容纳广泛的数据类型。列表在内部使用数组,并且执行速度应与数组一样快

我尝试用一些清晰的风格进行重构,如下所示:

public class MyTeamWeapons
{
    public List<string> Weapons { get; set; }
}

public class MyLoadout
{
    public List<MyTeamWeapons> TeamWeapons { get; set; } = new();
    public string PlayerModel { get; set; }
}

然后你可以在没有显式数组的情况下使用它:

    static void Main(string[] args)
    {
        MyLoadout loadout1 = new();

        loadout1.PlayerModel = "Player Model";
        loadout1.TeamWeapons.Add(new MyTeamWeapons
        {
            Weapons = new List<string> { "hellosd", "yous", "ds", "ad", "dd" }
        });

        MyLoadout loadout2 = new();

        loadout2.PlayerModel = "Player Model 2";
        loadout2.TeamWeapons.Add(new MyTeamWeapons
        {
            Weapons = new List<string> { "Foo", "Foo2" }
        });
    }

有关 NullReferenceException 的详细信息

0赞 AwatITWork 4/14/2022 #2

我建议将 Dictionary 与 List 一起使用,它为您提供了更大的灵活性并且易于使用,并且使用它们您将获得如此多的功能,这是我的示例,如果您不理解或有任何困难,请告诉我:

Dictionary<string, List<String>> teams = new Dictionary<string, List<String>>();

List<String> team1Wep = new List<String>();
team1Wep.Add("Weapons 1");
team1Wep.Add("Weapons 2");
team1Wep.Add("Weapons 3");
team1Wep.Add("Weapons 4");
team1Wep.Add("Weapons 5");

List<String> team2Wep = new List<String>();
team2Wep.Add("Weapons 11");
team2Wep.Add("Weapons 22");
team2Wep.Add("Weapons 33");
team2Wep.Add("Weapons 44");
team2Wep.Add("Weapons 55");

teams.Add("team1", team1Wep);
teams.Add("team2", team2Wep);

Console.WriteLine("This was a test");

有关词典的更多信息

**调试镜像:**Debug Image

1赞 MoRe 4/14/2022 #3
loadout.teamWeapons = new MyTeamWeapons[2];
loadout.teamWeapons[0] = new MyTeamWeapons();
// or new() in C#9+
loadout.teamWeapons[0].weapons = new[] {"hellosd", "yous", "ds", "ad", "dd"};

您必须在每个语句后添加一个 ,如下所示:

public string[]? weapons;

public MyTeamWeapons[]? teamWeapons;

什么?:它告诉编译器变量可以为 null

评论

2赞 paulsm4 4/14/2022
@noobCoder:MoRe是正确的。你初始化了数组(好!但是您忘记初始化该数组中的两个 MyTeamWeapons 对象中的任何一个(哎呀!因此,空引用异常。MoRe 还指出,你可以(可选!)使它可为 null(使用 “?”语法)。最后,正如其他人在下面指出的那样,您可能应该使用列表或字典之类的东西而不是数组。MyTeamWeapons[] teamWeapons
0赞 MoRe 4/14/2022
@paulsm4这是一个全面的答案,而不是评论。请编辑我的答案,至少:)
0赞 paulsm4 4/14/2022
问:你是否抱怨赞扬了你的回答(并且还“点赞”了它)???
0赞 MoRe 4/14/2022
@paulsm4 不,当然不是,但我认为你的评论(因为全面性)可以成为答案的一部分,可以完成我的回答,而不是评论:)因为我没有在我的答案中添加任何描述