关闭

类和结构的区别与联系

200人阅读 评论(0) 收藏 举报

类:

 

类是引用类型在堆上分配,类的实例进行赋值只是复制了引用,都指向同一段实际对象分配的内存

 

类有构造和析构函数

 

类可以继承和被继承

 

结构:

 

结构是值类型在栈上分配(虽然栈的访问速度比较堆要快,但栈的资源有限放),结构的赋值将分配产生一个新的对象。

 

结构没有构造函数,但可以添加。结构没有析构函数

 

结构不可以继承自另一个结构或被继承,但和类一样可以继承自接口

 

 

示例:

 

根据以上比较,我们可以得出一些轻量级的对象最好使用结构,但数据量大或有复杂处理逻辑对象最好使用类。

 

 

类                     结构
引用类型               值类型
一般需要封装有属性     一般公开字段无属性
有默认构造函数         无默认构造函数
new时字段可以不完全初始化  必须完全初始化
必须new                 可以不new 
类中可以为字段赋值      结构中不可以
类值放在栈中            值放在堆中 
可以被继承              不可以被继承 
类是引用类型,构造出来的对象存放在栈里面
结构是值类型,定义的变量存放在堆里面。

 

struct 的成员默认是 public, class 的成员默认是 private

目录

 

类与结构的实例比较

类与结构的差别

如何选择结构还是类

类与结构的示例比较

 

结构示例

 

public struct Person

{

   string Name;

   int  height;

   int  weight

   

   public bool overWeight()

    {

       //implement something

    }

}

类示例

 

public class TestTime

{

   int hours;

   int minutes;

   int seconds;

   

   public void passtime()

    {

       //implementation of behavior

    }

}

调用过程

 

public class Test

{

   public static ovid Main

    {

       Person Myperson=new Person      //声明结构

       TestTime Mytime=New TestTime    //声明类

    }

}

从上面的例子中我们可以看到,类的声明和结构的声明非常类似,只是限定符后面是 struct 还是 class 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?

 

类与结构的差别

 

值类型与引用类型

 

结构

 

结构是值类型,值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型。

 

 

类是引用类型,引用类型在堆上分配地址。

 

堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑。

 

因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用。

 

说明:

 

虽然结构与类的类型不一样,可是他们的基类型都是对象(object),C# 中所有类型的基类型都是 Object。

虽然结构的初始化也使用了new 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用。

继承性

 

结构

 

不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用 sealed 声明,可是结构是隐式的 sealed。

 

 

完全可扩展的,除非显示的声明sealed,否则类可以继承其他类和接口,自身也能被继承。

 

说明:

 

虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样。

例如:结构实现接口

 

interface IImage

{

   void Paint();

}

 

struct Picture : IImage

{

   public void Paint()

    {

        // painting code goes here

    }

   

   private int x, y, z;

   //other struct members

}

内部结构

 

结构

 

没有默认的构造函数,但是可以添加构造函数

没有析构函数

没有 abstract 和 sealed(因为不能继承)

不能有 protected 修饰符

可以不使用 new 初始化

在结构中初始化实例字段是错误的

 

 

有默认的构造函数

有析构函数

可以使用 abstract 和 sealed

有 protected 修饰符

必须使用 new 初始化

如何选择结构还是类

 

讨论了结构与类的相同之处和差别之后,下面讨论如何选择使用结构还是类:

 

堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。

结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有 1000 个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。

在表现抽象和多级别的对象层次时,类是最好的选择。

大多数情况下该类型只是一些数据时,结构时最佳的选择。

----

 

网友在 CSDN 上的回答:

 

结构可以看作是轻量级的类,在性能上要好一点。

 

相同之处:

 

结构和类对于程序来讲都通过指针操作,同样是面向对象的形式。

不同之处:

 

结构体对象总是在线程堆栈上操作,而不是托管堆上。

不能继承一个结构体(所以在调用结构体的方法时不需要查找 vtable: 虚函数继承表)

我们不能声明构造函数为空的结构体(不晓得为啥非得要这么设计)

结构体的构造函数内必须初始化所有变量(不晓得为啥非得要这么设计)

结构体的字段不能有默认值(默认都是二进制意义上的零值),但是可以在构造函数内改变“默认值”

.....

 

按照MSDN上的意思,实际上适合用 struct 的场合很小,结构使用指南:

 

行为与基元类型一样。

具有 16 字节以下的实例大小。

是不可改变的。

值语义是合意的。

 

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:14434次
    • 积分:340
    • 等级:
    • 排名:千里之外
    • 原创:17篇
    • 转载:11篇
    • 译文:1篇
    • 评论:0条
    文章存档