控制台 - 对象未实例化


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?我以两种方式实例化它,但都不起作用?

提前感谢!

你还必须更新你的chr.people数组。最好在椅子构造器

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

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[](的默认值(未显式定义时(为 null,因此没有访问.Length。您可以预测这一点(首先检查.people != null(,也可以在创建对象时对其进行初始化。

你的人员数组为空

在椅子的构造函数中实例化它

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");

问题是"people"属性未初始化。您有几种方法。

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 只允许像"foreach"这样的东西,所以没有人可以弄乱集合的内容,除非他们使用 Add/Remove/Clear 方法。

你可以把人做成一个列表<人>但你必须同意将所有内容暴露给你类的消费者。

最新更新