分配数组项的属性时出现NullReferenceException

时间:2014-11-28 16:15:57

标签: c# arrays

我想创建一个类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";

如果我调用我的类的实例(没有数组),一切正常。我想我的阵列有问题。也许在这种情况下使用阵列不是最好的想法。谢谢你的帮忙!

3 个答案:

答案 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命名约定,调用您的属性TextCounter(您无法将属性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";