控制台 - 对象未实例化

时间:2016-03-24 14:37:31

标签: c#

class Program

{
    class Chair
    {
        public Array[] people { get; set; }
    }

    static void Main(string[] args)
    {
       var chr = new Chair();
       if(chr.people.Length > 0) Console.WriteLine("got eeem");
}

我也试过这样做:

class Program

{

    Chair chr { get; set; }

    class Chair
    {
        public Array[] people { get; set; }
    }

    static void Main(string[] args)
    {
       var pr = new Program();
       if(pr.chr.people.Length > 0) Console.WriteLine("got eeem");
}

我一直收到同样的错误:

  

对象引用未设置为对象的实例。

检查长度是否大于0时(最后我会添加它)。

为什么我不能检查它大于0?我以两种方式实例化而且都不起作用?

提前致谢!

4 个答案:

答案 0 :(得分:2)

你还必须新建你的chr.people数组。最好在Chairs构造函数中

答案 1 :(得分:1)

你的人数组是空的

在主席

的构造函数中实例化它
class Chair
{
    public Chair()
    {
        people = new Array[0];
    }

    public Array[] people { get; set; }
}

或在检查长度之前检查是否为空。

if(chr.people != null && chr.people.Length > 0) Console.WriteLine("got eeem");

或者如果您使用最新的:

if (chr.people?.Length > 0) Console.WriteLine("got eeem");

答案 2 :(得分:1)

chr.people为null(未定义)。您需要分配它,或在主席的代码中提供默认(空)数组。

class Chair
{
    public Array[] people { get; set; }

    public Chair()
    {
        people = new Array[0]; // instantiate here
    }
}

现在,当您创建新的Chair时,您将拥有一个空数组(您可以访问Length属性)。

或者,您可以在实例化chr时分配它:

Chair chr = new Chair();
chr.people = new Array[0];
// now you can access chr.people.Length

这里的关键点是数组的默认值(未明确定义时)(在本例中为Array[])为空,因此无法访问.Length。您可以预料到这一点(首先检查.people != null),或者在创建对象时初始化它。

答案 3 :(得分:1)

问题在于"人们"属性未初始化。你有几种方法。

if (chr.people !=null && chr.people.Length > 0) Console.WriteLine("got eeem");

或确保人员已初始化

    public class Chair
    {
        public Chair()
        {
            people = new Array[0];
        }

        public Array[] people { get; set; }
    }

第一种是典型的防御性编码。例如,如果有人chr.people=null;

,会发生什么

问题是你没有在课堂上封装主席的担忧。这意味着使用椅子的所有东西都必须意识到它的局限性。主席课程的设计必须能够提供安全的界面并保护其资源(即人员财产)。

也许是这样的:

    public class Chair
    {
        private List<Person> people = new List<Person>();
        public IEnumerable<Person> People { get { return people; } }

        public void AddPerson(Person person)
        {
            people.Add(person);
        }
        public void RemovePerson(Person person)
        {
            people.Remove(person);
        }
        public void ClearPeople(Person person)
        {
            people.Clear();
        }
    }   
    public class Person
    {
        public string Name { get; set; }
    }

IEnumerable只允许像&#34; foreach&#34;因此,除非他们使用添加/删除/清除方法,否则没有人可以搞乱集合的内容。

你可以让人们成为一个名单&lt;人&GT;但你必须把所有东西暴露给你班上的消费者。