类和结构的区别与联系

转载 2012年03月25日 00:16:16

类:

 

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

 

类有构造和析构函数

 

类可以继承和被继承

 

结构:

 

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

 

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

 

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

 

 

示例:

 

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

 

 

类                     结构
引用类型               值类型
一般需要封装有属性     一般公开字段无属性
有默认构造函数         无默认构造函数
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 字节以下的实例大小。

是不可改变的。

值语义是合意的。

 

黑马程序员 结构和类的区别与联系

---------------------- Windows Phone 7手机开发、.Net培训、期待与您交流! ---------------------- 类和结构的区别: 1. 一个是...

基于c# 类、接口、结构的联系与区别详解

原文地址:点击打开链接 本篇文章是对c#中类与接口以及结构的联系与区别进行了详细的分析介绍,需要的朋友参考下 一.C#类与结构的差别 1. 值类型与引用类型 结构是值类型:值类型在堆栈...

C#结构体特性及与类的区别

  • 2012年09月10日 09:54
  • 3KB
  • 下载

C#.Net中类与结构的区别

  • 2008年11月23日 16:51
  • 34KB
  • 下载

程序中的栈和数据结构中的栈区别与联系

程序中的栈和数据结构中的栈区别与联系 1,程序中的“函数调用栈”是栈数据结构的一种应用。 2,函数调用栈一般是从高地址向低地址增长的。         a,栈底为内存的高地址处        ...

计算机组成原理,微机原理,计算机体系结构这三门课的区别和联系

组成原理是让你从整体上精略地让你了解计算机是怎么工作的,,内容上侧重于计算机的几大组成(运算器,控制器,存储器,输入设备,输出设备与总线结构),具体来说,是具体一条指令在cpu中是如何执行的,计算机的...

C++中结构体与类的区别

学习了C++的面向对象,最常见的和写的就是类结构体,下面主要介绍一下结构体和类的区别。 首先类是C++中面向对象独有的,但是C和C++中都有结构体,下面我们来看一下C和C++中结构体的区别。这里主要...
  • nopoppy
  • nopoppy
  • 2016年10月25日 22:37
  • 1137
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:类和结构的区别与联系
举报原因:
原因补充:

(最多只允许输入30个字)