提问人:noobCoder 提问时间:4/14/2022 最后编辑:Theodor ZouliasnoobCoder 更新时间:4/14/2022 访问量:589
初始化新字符串数组时引用为 空 [duplicate]
Null reference when initializing new string array [duplicate]
问:
我正在尝试创建 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 个团队,每个团队都有一系列字符串来保存武器名称。
任何帮助都会很棒,谢谢!
答:
0赞
Reza Heidari
4/14/2022
#1
获取意味着您错过了我认为与 相关的对象的实例化。NullReferenceException: Object reference not set to an instance of an object
loadout
列表 (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");
有关词典的更多信息
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 不,当然不是,但我认为你的评论(因为全面性)可以成为答案的一部分,可以完成我的回答,而不是评论:)因为我没有在我的答案中添加任何描述
评论
loadout
new MyTeamWeapons[2]
创建一个数组,其中每个值都是 。null