A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵鹏程 中级黑马   /  2012-7-25 21:22  /  2166 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

类(class)和结构(struct)的区别是什么?它们对性能有影响吗?class 跟struct 在内存中存放方式不是一样的

评分

参与人数 1技术分 +1 收起 理由
郑文 + 1 神马都是浮云

查看全部评分

7 个回复

倒序浏览
1、类可继承,机构不可继承
2、类是引用类型,结构是值类型
3、类在堆中存放,结构在载中存放

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
深黑色 发表于 2012-7-25 21:52
1、类可继承,机构不可继承
2、类是引用类型,结构是值类型
3、类在堆中存放,结构在载中存放 ...

哈哈 错别字 一堆,,就性能方面呢?
回复 使用道具 举报
赵鹏程 发表于 2012-7-25 21:56
哈哈 错别字 一堆,,就性能方面呢?

呵呵 不好意思打快了。。。。
关于性能:
1.堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些   
2.结构表示如点、矩形和颜色这样的轻量对象,例如,如果声明一个含有   1000   个点对象的数组,则将为引用每个对象分配附加的内存。在此情况下,结构的成本较低。   
3.在表现抽象和多级别的对象层次时,类是最好的选择   
4.大多数情况下该类型只是一些数据时,结构时最佳的选择   
回复 使用道具 举报

1、类通常用于对较为复杂的行为建模,或对要在创建类对象后进行修改的数据建模。结构最适合一些小型数据结构,这些数据结构包含的数据以创建结构后不修改的数据为主。
2、结构与类共享大多数相同的语法,但结构比类受到的限制更多
3、在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
4、结构不能声明默认构造函数(没有参数的构造函数)或析构函数。
5、结构在赋值时进行复制。
6、结构是值类型,而类是引用类型。
7、与类不同,结构的实例化可以不使用 new 运算符。
8、结构可以声明带参数的构造函数。
9、一个结构不能从另一个结构或类继承,而且不能作为一个类的基。
10、结构可以实现接口。
11、结构可用作可以为 null 的类型,因而可向其赋 null 值。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
1.结构的构造函数和类的构造函数不同。
  a.结构不能包含显式的无参数构造函数。结构成员将自动初始化为它们的默认值。
  b.结构不能包含以下形式的初始值设定类:base(argument-list);
2.对于结构中的实例字段成员,不能在声明时赋值初始化。
3.声明了结构类型后,可以使用new运算符创建构造对象,也可以不使用new关键字。如果不使用new,那么在初始化所有字段之前,字段将保持未赋值状态且对象不可用。
4.结构不支持继承,即一个结构不能从另一个结构或类继承,而且不能作为一个类的基类。但是,结构从基类OBJECT继承。结构也可以实现接口。
5.什么时候用结构呢?结构使用简单,并且很有用,但是要牢记:结构在堆栈中创建,是值类型,而类是引用类型。每当需要一种经常使用的类型,而且大多数情况下该类型只是一些数据时,使用结构能比使用类获得更佳性能

结构是值类型,所以会影响性能,但根据使用结构的方式,这种影响可能是正面的,也可能是负面的。正面的影响是为结构分配内存时,速度非常快,因为它们将内联或者保存在堆栈中。在结构超出了作用域被删除时,速度也很快。另一方面,只要把结构作为参数来传递或者把一个结构赋给另一个结构(例如A=B,其中A和B是结构),结构的所有内容就被复制,而对于类,则只复制引用。这样,就会有性能损失,根据结构的大小,性能损失也不同。注意,结构主要用于小的数据结构。但当把结构作为参数传递给方法时,就应把它作为ref参数传递,以避免性能损失——此时只传递了结构在内存中的地址,这样传递速度就与在类中的传递速度一样快了。另一方面,如果这样做,就必须注意被调用的方法可以改变结构的值。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
李根 中级黑马 2012-7-27 14:53:35
7#
类是一种“引用类型”。创建类的对象时,对象赋值到的变量只保存对该内存的引用。将对象引用赋给新变量时,新变量引用的是原始对象。通过一个变量做出的更改将反映在另一个变量中,因为两者引用同一数据。
结构是一种值类型。创建结构时,结构赋值到的变量保存该结构的实际数据。将结构赋给新变量时,将复制该结构。因此,新变量和原始变量包含同一数据的两个不同的副本。对一个副本的更改不影响另一个副本。

评分

参与人数 1技术分 +1 收起 理由
宋天琪 + 1

查看全部评分

回复 使用道具 举报
刘旺 中级黑马 2012-7-27 15:59:25
8#
本帖最后由 刘旺 于 2012-7-27 16:02 编辑

C#类与结构的差别

    1. 值类型与引用类型

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

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

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

    因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用
    1).虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object
    2).虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用

    2.继承性

    结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用sealed声明,可是结构是隐式的sealed类:完全可扩展的,除非显示的声明sealed 否则类可以继承其他类和接口,自身也能被继承

    注:虽然结构不能被继承 可是结构能够继承接口,方法和类继承接口一样
C#类与结构如何选择

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

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

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

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

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

评分

参与人数 1技术分 +2 收起 理由
宋天琪 + 2

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马