首页 > 编程语言 >C#结构体和类的区别

C#结构体和类的区别

时间:2023-10-14 15:44:06浏览次数:37  
标签:区别 C# 体和类 int sealed 类型 构造函数 public 结构

C#结构体和类的区别

Posted on 2015-08-09 17:33  greyhh  阅读(2404)  评论(0)  编辑  收藏  举报

结构体和类的区别

1. 值类型与引用类型 
结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,通过使用结构可以创建更多的值类型 
类是引用类型:引用类型在堆上分配地址 
堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构处理作为基类型对待的小对象,而类处理某个商业逻辑 
因为结构是值类型所以结构之间的赋值可以创建新的结构,而类是引用类型,类之间的赋值只是复制引用 
注: 
  a.虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object 
  b.虽然结构的初始化也使用了New 操作符可是结构对象依然分配在堆栈上而不是堆上,如果不使用“新建”(new),那么在初始化所有字段之前,字段将保持未赋值状态,且对象不可用 

 

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

 

3.内部结构: 
结构: 
没有默认的构造函数,但是可以添加构造函数 (结构体中不能定义默认的、不带参数的构造函数,只能定义带参的构造函数)
没有析构函数 
没有 abstract 和 sealed(因为不能继承) 
不能有protected 修饰符 
可以不使用new 初始化 
在结构中初始化实例字段是错误的 
类: 
有默认的构造函数 (可以定义默认的、不带参数的构造函数,或者带参的构造函数)
有析构函数 
可以使用 abstract 和 sealed 
有protected 修饰符 
必须使用new 初始化

如何选择结构还是类 

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

复制代码
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 //声明类
}
}
复制代码

标签:区别,C#,体和类,int,sealed,类型,构造函数,public,结构
From: https://www.cnblogs.com/sexintercourse/p/17764255.html

相关文章

  • MFC静态反编译GetMessageMap相关查找方法
    MFC中GetMessageMap包含对多数消息处理的结构,界面菜单,按钮都在这,找到GetMessageMap很关键structAFX_MSGMAP_ENTRY{UINTnMessage;//windowsmessageUINTnCode;//controlcodeorWM_NOTIFYcodeUINTnID;//controlID(or0forwindowsmessage......
  • ORACLE:集群oracle查看session的语句
    1.查看session可以把status改为ACTIVE和INACTIVEv$session和gv$session只在RAC中区别明显,有g是全局的,rac的两个数据库中的内容,没有是但实例的数据库的,内容不全rac么?  gv$开头视图是rac全局的,v$开头是本节点的gv$session比v$session多一个字段而已: INST_ID selectmachi......
  • pycharm连接远程服务器,代码成功运行,但一些基本python属性和函数会报红线(例如print)解决
    状况:pycharm连接远程服务器,代码成功运行,但一些常见python属性和方法报红线,例如print。当你在程序中输入print这种基本方法时,pycharm是不会有输入提示的,输入后也会报红线解决方法:将远程服务器中的环境变量添加至pycharm中查出服务器中环境变量:在xshell中输入vim~/.bashrc执......
  • jsoup获取指定class名称的标签
      publicvoidloadHtmlFile(StringhtmlFilePath){try{Documentdoc=Jsoup.parse(newFile(htmlFilePath),"utf-8");Elementsdivs=doc.select("div.hop1");for(Elementdiv:divs){......
  • Vue3| 组合式 API——provide 和 inject
    作用和场景:顶层组件向任意的底层组件传递数据和方法,实现跨层组件通信 跨层传递普通数据步骤:1.顶层组件通过provide函数提供数据provide('key', 顶层组件中的数据) 2.底层组件通过inject函数获取数据const message=inject('key')   //'k......
  • abc282E - Choose Two and Eat One
    E-ChooseTwoandEatOne非常巧妙的一集可以将整个局面看作一张图,选两个数获得的score就是它们的边权,然后做最大生成树,不难发现操作和建树之间是一一对应的。#include<cstdio>#include<algorithm>#include<cstring>#include<cmath>#include<queue>#include<map>#defin......
  • Java NIO 中的 Buffer、Channel 和 Selector:高效的非阻塞 IO
    在Java中,标准的IO操作使用阻塞模式,这意味着每个IO操作都会阻塞当前线程直到操作完成。而JavaNIO(NewIO)提供了一种基于事件驱动的非阻塞IO模型,通过三大组件——Buffer(缓冲区)、Channel(通道)和Selector(选择器),可以实现更高效的IO操作。本文将详细介绍和说明这三大组件的......
  • 论文阅读:CLIP2Point: Transfer CLIP to Point Cloud Classification with Image-Depth
    CLIP2Point:TransferCLIPtoPointCloudClassificationwithImage-DepthPre-TrainingCLIP2Point:通过图像深度预训练将CLIP传输到点云分类  ICCV2023摘要由于训练数据有限,3D视觉和语言的预训练仍在开发中。最近的工作尝试将视觉语言(V-L)预训练方法转移到3D视觉。然而,3D......
  • VBA Picture Copy&Paste
    setmyshapes=.worksheets(1).shapes(“1”)myshapes.CopyPictureAppearance:=xlScreen,Format:=xlPictureThisWorkbook.Worksheets("Sheet3").PasteDestination:=ThisWorkbook.Worksheets("Sheet3").Cells(s,c)``SubpictureCV()Application.Scr......
  • Display volume of alsa card on i3status
    Displayvolumeofalsaoni3statusSystem:gentooDesktop:i3wmhereismyi3statusconfigofvolumes:order+="volumemaster"order+="volumespeaker"volumemaster{format="♪%volume"format_muted=......