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