首页 > 代码库 > 类与结构那点事

类与结构那点事

有时候总是分不清类和结构,在什么时候用类?在什么时候用结构?

  • 按值区分

        类,引用类型

        结构,值类型

  • 定义方式

        类:字段(除const字段之外)应总是私有的,并 公有属性封装;

1 ResponseCassetteCounter cassetteCounter = new ResponseCassetteCounter();

        结构:结构即可以像类一样用过new运算符,但并未为结构分配堆中的内存;声明后还可以直接对字段赋值; 编译器是提供一个无参数的默认构造函数,它是不允许替换的;结构不支持实现继承,但支持接口继承;

1 Dimensions point = new Dimensions();2 point.Length = 3;3 point.width = 6;
1 Dimensions point;2 point.Length = 3;3 point.Width = 6;

        如果类用第二种方式定义的话会产生编译错误, 因为point包含一个未初始化的引用;

  •  性能

        类存储在堆中,通过这种方式可以在数据的生存期上获得很大的灵活性,但性能会有一定的损失,因为托管堆的优化,这种性能损失比较小;时仅需要一个小的数据结构。 此时,类提供的功能多于我们需要的功能,由于性能
原因,最好使用结构。
对于分配内存来说,结构是要比类快的,但是把结构作为参数来传递或者把一个结构赋予另一个结构(如A=B,其A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用 。 这
样就会有性能损失,根据结构的大小,性能损失也不同

       把结构作为参数传递给方法时,应 把它作为ref参数传递,以避免性能损失;此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度工样快了

  • 构造函数

        止在C#的结构内使用无参数的构造函数,认构造函数把数值字段都初始化为0,把引用类型字段初始化为null,总是隐式地给出,即使提供了其他带参数的构造函数,也是如此。提供字段的初始值也不能绕过默认构造
函数
,例如下面的代码编译时不能通过的

1 struct Dimensions2 {3     pub1ic double Length = 1; // error. Initial values not allowed4     pub1ic double Width = 2;// error. Initial values not allowed5 }

        当然,如Dimensions声明为一个类,这段代码就不会有编译错误;

 

类与结构那点事