结构体和类的区别

结构体和类的区别结构体和类的区别 在做一个项目时 使用了较多的结构体 并且存在一些结构体的嵌套 即某结构体成员集合包含另一个结构体等 总是出现一些奇怪的错误 才终于下决心好好分析一下到底类和结构体有啥不同 虽然它们很相似 但确实有很大的不同 用不好难免出的问题会比较多 现总结一下 一 结构体和类非常相似 1 定义和使用非常相似 例子如下 publicstruct st

结构体和类的区别:
    在做一个项目时,使用了较多的结构体,并且存在一些结构体的嵌套,即某结构体成员集合包含另一个结构体等,总是出现一些奇怪的错误,才终于下决心好好分析一下到底类和结构体有啥不同,虽然它们很相似,但确实有很大的不同,用不好难免出的问题会比较多,现总结一下:

一、结构体和类非常相似:

1,定义和使用非常相似,例子如下:
public struct Student
{

    string Name;
    int Age;
}
public class Question
{

    int Number;
     string Content;
}
使用:
Student s=new Student();
Question q=new Question();
2,两者都是container类型,这表示它们可以包含其他数据类型作为成员。

3,两者都拥有成员,包括:构造函数、方法、属性、字段、常量、枚举类型、事件、以及事件处理函数。

4,两者的成员都有其各自的存取范围。例如,可以将某一个成员声明为Public,而将另一个成员声明为Private。

5,两者都可以实现接口。

6,两者都可以公开一个默认属性,然而前提是这个属性至少要取得一个自变量。

7,两者都可以声明和触发事件,而且两者都可以声明委托(Delegate)。

二、结构体和类的主要区别
在网上摘抄了两段:

=====第一段:=====

1,结构是实值类型(Value Types),而类则是引用类型(Reference Types)。

2,结构使用栈存储(Stack Allocation),而类使用堆存储(Heap Allocation)。

3,所有结构成员默认都是Public,而类的变量和常量数则默认位Private,不过其他类成员默认都是Public。

4,结构成员不能被声明位Protected,而类成员可以。

5,结构变量声明不能指定初始值、使用New关键字货对数组进行初始化,但是类变量声明可以。

6,结构不能声明默认的构造函数,也就是不拥有参数的非共享构造函数,但是类则无此限制。

7,二者都可以拥有共享构造函数,结构的共享构造函数不能带有参数,但是类的共享构造函数则可以带或者不带参数。

8,结构不允许声明析构函数(Destructor),类则无此限制。

9,结构的实例(Instance)声明,不允许对包含的变量进行初始化设定,类则可以在声明类的实例时,同时进行变量初始化。

10,结构是隐式继承自ValueType类,而且不能继承任何其他类型,类则可以继续自ValueType以外的任何类。

11,结构是无法被继承的,类则可以。

12,结构永远不会终止,因此CLR不会在任何结构上调用Finalize方法。类则是由内存回收进程加以终止,当内存回收进程检测到没有任何作用的类时,它就会调用类的Finalize方法。

13,结构不需要构造函数,类则需要构造函数。

14,结构只能在一种情况下使用非共享构造函数,那就是非共享构造函数会接受参数。但是类则无此限制,它可以使用带参数或不带参数的非共享构造函数。

14,每一个结构都具有无参数的隐含公共构造函数,此构造函数会将结构的所有成员初始化为其默认值。不需要重新定义这个行为。

在“实例和变量”层面上,由于结构是数值类型的,因此每一个结构变量会永远的绑定到结构实例上。然而类是引用类型的,而且对象变量可引用不同的类实例,在此方面的区别,会对使用将结构和类造成如下的影响:

15,结构变量会隐式的使用结构的无参数构造函数来初始化成员,这就意味语句 Struct S = new Struct()。

16,当您将一个结构变量赋值给另一个,或者将结构实例传递到程序变量时,所有变量成员的值会复制到新的结构中。当您将一个对象变量赋值给另一个,或者将对象变量传递给程序时,则只是复制指针。

17,您可以将Null值赋值给结构变量,但是该实例会一直与该变量保持关联。虽然变量成员会因此赋值而重新初始化,但是您还是可以调用变量的方法并访问其数据成员。相反的,如果您将对象变量设定为Null,您就会中断它与任何类型实例的关联,而且除非您再将另一个实例赋值给它,否则无法通过变量访问任何成员。

18,您可以在不同时间将不同的类的实例赋值给同一个对象变量,而且在同一时间可有好几个对象变量引用相同的类实例,如果您对类成员值做了改变,则其他指向相同实例的对象变量也会发生改变。然而,结构成员则会封装在他们自己的实例中,变更结构成员值并不会对其他任何结构变量的成员造成影响,甚至也不会影响相同结构声明的其他实例。

19,两个结构必须以成员对成员的比较方式来执行相等比较。两个对象变量可以使用Equals方法来加以比较。Equals会判断两个变量是否指向相同的实例。

=====第二段:=====

1,结构体是一种值类型,而类是引用类型。值类型用于存储数据的值,引用类型用于存储对实际数据的引用。那么结构体就是当成值来使用的,类则通过引用来对实际数据操作。
2,结构体的定义是:有些数据既是相互关联的,又共同描述一个完整事物,如:一个学生的整体信息,学号、姓名、性别等。而类则使用在需要比较有层次的数据上面。
3,类是反映现实事物的一种抽象,而结构体的作用只是一种包含了具体不同类别数据的一种包装,结构体不具备类的继承多态特性 
4,构造函数是为了初始化类的字段而存在的,而结构体并不需要初始化就能使用,因此,结构体中并不存在默认的构造函数。
结构:
没有默认的构造函数,但是可以添加构造函数
    没有析构函数
    没有 abstract 和 sealed(因为不能继承)
    不能有protected 修饰符
    可以不使用new 初始化
在结构中初始化实例字段是错误的
类: 
 有默认的构造函数
 有析构函数
 可以使用 abstract 和 sealed 
有protected 修饰符
必须使用new 初始化

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/199340.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月26日 下午1:19
下一篇 2026年3月26日 下午1:19


相关推荐

  • Java英文简历(java工程师求职简历)

    java工程师英文简历范文要仔细检查已成文的`个人简历,绝对不能出现错别字、语法和标点符号方面的低级错误。最好让文笔好的朋友帮你审查一遍,因为别人比你自己更容易检查出错误。java工程师英文简历范文篇一yjbysMale,20,ThecantoneseEducation:collegeWorkinglives:freshgraduatesExpectedsalary:3000-5…

    2022年4月16日
    48
  • git clone 后的文件找不到在哪?

    git clone 后的文件找不到在哪?经常在gihub上下载文件,但是发现这样clone下后不知道文件给放哪了?一般情况下会存放在命令行对应的目录下:win+R>cmd查看命令行地址:这个地址就是你git后的地址。如果想要改变git后的存放地址也简单,先改变命令行的地址,在gitclone文件,这里提供一个快捷的方式,在你目标文件夹下,shift+右键,选择打开powershell窗口,就会打开…

    2022年7月21日
    274
  • opengrok使用教程之单工程(上)

    opengrok使用教程之单工程(上)OpenGrok简介有些情况下,我们需要在GB级别甚至几十GB级别且随时不断更新的大型代码(比如Android源码)里面搜索阅读源码,那么我们自然而然会有以下一些基本的需求:能够快速搜索代码代码可存放于本地/服务器代码之间可以跳转跨平台易于维护…显然SourceInsight、ctags、grep等工具在这些场景下就不太适合,于是有了OpenGrok这类代码搜索引擎。先看看维…

    2022年5月29日
    104
  • 阿里云申请免费ssl证书及安装_阿里云服务器升级配置

    阿里云申请免费ssl证书及安装_阿里云服务器升级配置阿里云购买免费SSL证书1.操作环境2.购买免费SSL证书3.证书申请,绑定域名《下一篇:Nginx+SSL证书,配置https》1.操作环境阿里云(已实名的企业账号)2.购买免费SSL证书2.1.如图,阿里云官网登陆后,搜索框内输入SSL,点击证书控制台,进入后点击购买证书2.2.如图,选中单域名–DVSSL–免费版,点击立即购买2.3.如图,勾选阅读,点击支付,在支付成功界面,点击证书控制台3.证书申请,绑定域名3.1.如图,在证书控制台,点击证书申请

    2022年10月3日
    6
  • pycharm安装cv2模块

    pycharm安装cv2模块cv2 模块安装

    2026年3月18日
    2
  • luajit反编译工具_andlua反编译工具

    luajit反编译工具_andlua反编译工具IntheLuaJITsourcedistribution,thereisafoldercalled’libs’whichcontainnecessaryLuafiles.Renamethisas’jit’.Makeafolderinthesamedirectoryasluajit.exeandcallit’lua’;

    2026年4月16日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号