C# 类与类之间的嵌套,声明时子类对象为空的问题
有时候我们会遇到一个问题,那就是类A包含了另外一个类B的对象,当我们new出来一个类A想直接获取类B的成员或赋值时会遇到报错,这是因为我们new出来的A类型对象只申请了其他成员的内存,其中包含的B类成员对象并没有分配内存,也就是类B的成员变量为空,当你想使用类B成员里面的数据时自然而然就报错了,所以在这种情况下,我们也要对类B的成员负责,也给他new一下。
举例说明:
1.先声明两个类,A和B,类A中包含类B的一个成员
class A
{
public string gender;
public B signal;
public A()
{
}
}
class B
{
public string name;
public B()
{
}
}
2.然后我们new一个类A的对象,直接引用类B中的成员
static void Main(string[] args)
{
A data = new A();
data.b.name = "傻瓜";
}
3.直接运行后会报错,如图所示data中的b对象为空,应用b对象中的成员name直接报错:
4.既然这样b对象是空的那就new一次再使用,打断点发现代码可以直接运行完毕,说明确实是需要new一次才能使用b中的成员
5.但朋友们有没有发现一个问题,当我们的类或者结构体多层次嵌套的时候,像类A中包含类B,类B中包含类C,当我们new一个A对象后,要是用里面的子集类成员岂不是要将里面包含的所有子类成员new一次,那实在是太麻烦了,所以呢在这里我在给出一个既简单又方便的方法,当然很多熟悉的朋友已经知道是怎么回事了,那就是利用类A的构造函数将包含的子类成员b给new出来,这样当我们直接使用b的成员时就不用一次次的去new啦!即使再多的层级嵌套都没关系啦:
class A
{
public string gender;
public B b;
public A()
{
b = new B();
}
}
class B
{
public string name;
public C c;
public B()
{
c = new C();
}
}
class C
{
public int age;
public C()
{
}
}
6.最后试验一次果然可以直接使用
总结:要使用对象中的引用类型成员,必须要在使用之前初始化,引用类型包括:<1>.类类型<2>.数组类型(包括List和Dictionary等)<3>.字符串类型<4>.委托类型,注意:结构体和枚举同int一样属于数值类型。