C# 类与类之间的嵌套,声明时子类对象为空的问题

来源:互联网 发布:淘宝商家申请 编辑:程序博客网 时间:2024/06/07 05:49

  有时候我们会遇到一个问题,那就是类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一样属于数值类型。

原创粉丝点击