我想创建一个类Word的数组。这是代码:
public static void Main(string[] args)
{
Word[] Wörter = new Word[5];
Wörter[0]._Word_ = "Hallo";
Wörter[1]._Word_ = "Flugzeug";
Wörter[2]._Word_ = "Automobil";
Wörter[3]._Word_ = "Musikanlage";
Wörter[4]._Word_ = "Steuerung";
}
public class Word
{
private string _Word;
private int _counter;
public string _Word_
{
get
{
return _Word;
}
set
{
_Word = value;
}
}
public int _counter_
{
get
{
return _counter;
}
set
{
_counter = 0;
}
}
}
我总是在这一行中得到一个System.NullReferenceException
Wörter[0]._Word_ = "Hallo";
如果我调用我的类的实例(没有数组),一切正常。我想我的阵列有问题。也许在这种情况下使用阵列不是最好的想法。谢谢你的帮忙!
答案 0 :(得分:5)
您只是将数组而不是元素
Word[] Wörter = new Word[5];
Wörter[0] = new Word { _Word_ = "Hallo" };
依旧......
答案 1 :(得分:3)
问题在于您正在创建一个数组,但该数组包含空的引用 - 您永远不会创建Word
的任何实例。你想要这样的东西:
Word[] Wörter = new Word[5];
Wörter[0] = new Word();
Wörter[0]._Word_ = "Hallo";
// etc
但是,您可以使用对象初始值设定项来减少代码以达到相同的效果:
Word[] Wörter = new Word[5];
Wörter[0] = new Word { _Word_ = "Hallo" };
...
然后你可以使用数组初始化器在一个语句中完成整个过程:
Word[] Wörter =
{
new Word { _Word = "Hallo" },
new Word { _Word_ = "Flugzeug" },
new Word { _Word_ = "Automobil" },
new Word { _Word_ = "Musikanlage" },
new Word { _Word_ = "Steuerung"}
};
我的观点中的下一步是开始遵循.NET命名约定,调用您的属性Text
和Counter
(您无法将属性Word
称为&{ #39; s类的名称),使用自动实现的属性进一步减少cruft,然后在构造函数中添加一个构造函数获取属性的初始值:
public class Word
{
public string Text { get; set; }
public int Counter { get; set; }
public Word(string text)
{
Text = text;
}
}
Word[] words =
{
new Word("Hallo"),
new Word("Flugzeug"),
new Word("Automobil"),
new Word("Musikanlage" )
new Word("Steuerung")
};
看起来不是更好吗? :)
您可能还希望将Text
属性设置为只读。在C#6登陆之前,这意味着要么保留私人制定者,要么使用"手动实施"财产,但在C#6你能够写:
public string Text { get; }
并在构造函数中指定它。
此外,您需要考虑是否真的需要一个阵列。通常使用List<T>
可以提供更大的灵活性。
答案 2 :(得分:0)
尝试这种方式:
Word[] Wörter = new Word[5];
for (int i = 0; i < 5; i++)
Wörter[i] = new Word();
Wörter[0]._Word_ = "Hallo";
Wörter[1]._Word_ = "Flugzeug";
Wörter[2]._Word_ = "Automobil";
Wörter[3]._Word_ = "Musikanlage";
Wörter[4]._Word_ = "Steuerung";