C#中结构与类的区别

c#类与结构体区别 本文对比了C#中结构体(struct)与类(class)的主要区别:1)定义关键字不同;2)结构体不允许字段初始化,类允许;3)结构体隐式构造函数无法重写且必须初始化所有字段,类可自定义无参构造函数;4)结构体对象可不使用new创建,但需手动初始化字段。通过代码示例详细说明了这些语法差异,帮助开发者正确使用这两种类型。 阅读详情
目录

  类与结构的实例比较

  类与结构的差别

  如何选择结构还是类   

  一.类与结构的示例比较:

  结构示例:

  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 的区别,而且使用时,定义新的结构和定义新的类的方法也非常类似。那么类和结构的具体区别是什么呢?   

  二 .类与结构的差别

  1. 值类型与引用类型

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

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

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

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

  注:

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

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

  2.继承性

  结构:不能从另外一个结构或者类继承,本身也不能被继承,虽然结构没有明确的用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

  }
  

  3.内部结构:

  结构:

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

  没有析构函数

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

  不能有protected 修饰符

  可以不使用new 初始化

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

  类:

  有默认的构造函数

  有析构函数

  可以使用 abstract 和 sealed

  有protected 修饰符

  必须使用new 初始化   

  三.如何选择结构还是类

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

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

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

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

  4. 大多数情况下该类型只是一些数据时,结构时最佳的选择 
群晖NAS下docker安装MySql 本文将一步一步讲解如何在群晖NAS的docker中启用一个MySQL容器 , 算是初学者对问题解决的一个记录. 阅读详情

相关推荐

给爸妈买的红米12C想装个老年桌面?先别急,解锁BL和Root前你得知道这些

本文详细解析了红米12C解锁BL和Root的利弊,为想要为长辈简化手机操作的用户提供全面指南。文章对比了BL解锁与Root的技术差异,推荐优先使用MIUI内置的极简模式等官方功能,并评估了Root的实际必要性。若必须Root,提供了安全操作流程和长期维护建议,帮助用户做出明智选择。

weixin_30265103的博客 317

[C#]结构体和类的区别

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

weixin_30596165的博客 3218

Visual Studio 2015 插件开发 从入门到放弃(一)

必需知识:C#和Visual Studio (1)安装 Visual Studio 2015 的时候选择 Visual Studio 扩展性工具(Visual Studio Extensibility Tools)。对于已经安装好 Visual Studio 2015 的小伙伴,可以找VS2015的安装包,或者在程序与功能中找VS2015双击,在VS2015界面中选择 修改,再选择

AncientPeople的博客 2万+

类和结构的区别?

对于结构,构造函数的工作方式有一些区别,尤其是编译器总是提供一个无参数的默认构造函数。类:类默认会隐式生成一个无参构造函数,当手动定义构造函数时,隐式的无参构造函数就不存在了。5.2、在不适用new的情况下,需要将结构中的字段进行赋值后才可以调用结构中的方法。结构:必须要为结构体内的每个字段赋值。5.1、使用new可以直接调用。

SJ15630070060的博客 682

细节增强卷积DEConv详解及代码复现

这种预训练模型能够捕捉图像的基本特征,为后续的端到端训练提供良好的初始参数。例如,在RESIDE和RESIDE-6K数据集上的实验结果表明,使用MSPLCK模块的MixDehazeNet-L模型在RESIDE-IN数据集上首次超过了42dB的PSNR指标,且在所有数据集上均优于先前的方法。例如,在RESIDE和RESIDE-6K数据集上的实验结果表明,使用MSPLCK模块的MixDehazeNet-L模型在RESIDE-IN数据集上首次超过了42dB的PSNR指标,且在所有数据集上均优于先前的方法。

hasakie的博客 1910

树莓派4B之OpenCV人脸识别实战:从Haar Cascade到实时检测(保姆级教程)

本教程详细介绍了如何在树莓派4B上部署OpenCV,并利用Haar Cascade算法实现实时人脸识别。内容涵盖从系统环境搭建、算法原理解析到代码逐行讲解与实战调优,为嵌入式AI和计算机视觉初学者提供了一份完整的保姆级实践指南。

p8q9r0的博客 402

结构和类的区别

结构和类非常相似,今天就来总结下结构和类有什么区别 1.首先就是语法上的区别,关键字的不同(class和struct) 类的语法: class Student { private string Name; private int Age; public void Introduce() { Consol...

beryljer的博客 1563

R语言分类变量的统计描述

三篇介绍了连续变量的统计描述的R语言相关函数,计算数值的相关统计指标。本文介绍分类变量的统计描述及如何在R语言中实现。 不同于连续变量,分类变量的统计描述主要是汇总分类变量各类别例数及百分比。 1、table()函数 ...

zsc943290710的博客 1万+

C#基础:类class与结构struct的区别

一般来说,某个类对象使用另一个类的对象赋值时,则两者共用一个内存地址【节约内存空间】,ReferenceEquals引用比较此时返回true类的构造函数(构造方法)如果一个类没有显示定义构造函数,则默认有一个无参构造函数,如果一个类已定义了带参数的构造函数,如果不手动定义无参构造函数,则没有无参构造函数。

ylq1045的专栏 1388

6、基于深度强化学习的无人机路径规划

本文介绍了一种结合人工势场法的改进DQN深度强化学习算法在无人机路径规划中的应用。通过设计合理的网络结构、状态空间、动作空间和融合引力-斥力机制的奖励函数,实现了无人机在复杂环境中的自主避障与目标导向飞行。采用轻量级神经网络提升实时性,并在Gazebo仿真环境中进行训练与测试,结果表明该算法具有快速收敛、高成功率和良好适应性。实验评估指标包括损失函数、最大Q值和任务成功率,验证了方法的有效性。文章还探讨了其在物流配送、农业植保和环境监测等领域的应用前景,并展望了多无人机协同与复杂环境适应性等未来研究方向。

html8的博客 238

人群仿真软件:AnyLogic_(12).AnyLogic高级功能应用

在AnyLogic中,自定义行人行为是通过编写Java代码来实现的。行人行为的自定义可以包括行走路径的选择、速度变化、交互行为等。这使得仿真模型更加灵活和真实。

kkchenjj的博客 1060

你真的了解:类与结构吗?(细谈类与结构)

类与结构的概念? 类与结构的特点? 类与结构的声明? 类与结构的区别? 类与结构的使用场景?

凭时间赢来的东西,时间肯定会为之作证 12万+

物联网Node-Red开发教程-第6章 HTTP与Web服务

本章摘要(147字): 本章系统讲解了Node-RED中的HTTP节点应用,重点包括: 三大核心HTTP节点功能:http in(接收请求)、http response(返回响应)、http request(调用外部API) 详细演示了REST API开发流程,包括路径参数(req.params)处理和响应构造 提供了创建Hello World API、传感器数据接口等实用示例 涵盖HTTP方法特性、状态码设置及响应头配置等关键知识点 通过流程图和JSON配置直观展示节点连接方式,帮助快速掌握Web服务开发

shihui2003的博客 264

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

首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字struct.在语法上其实类和结构有着很多相似的地方. 1、结构体中声明的字段无法赋予初值,类可以: 执行以上代码将出现“结构中不能实例属性或字段初始值设定”的报错,而类中无此限制,代码如下: 2、结构体的构造函数中,必须为结构体所有字段赋值,类的构造函数无此限制: 补充:类与结构的选择 首先明确,类的对象是存储在堆空间中,结构存储在栈中。堆空间大,但访问速度较慢,栈空间小,访问速度相对更快。故而,当我们描述一个轻

腻害 2489

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C#中结构体与类的区别

结构是一种关键字struct声明的自定义数据类型。与类相似,也可以包含构造函数,常数,字段,方法,属性,索引器,运算符和嵌套类型等。不过,结构是值类型,类是引用类型。   结构体和类的区别 1、值类型与引用类型 结构体是值类型:值类型在栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32结构,通过使用结构可以创建更多的值类型。 类是引用类型:引用类型在堆上分...

5497

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C# 结构体与类的区别

经常听到有朋友在讨论C#中的结构与类有什么区别.正好这几日闲来无事,自己总结一下,希望大家指点. 1. 首先是语法定义上的区别啦,这个就不用多说了.定义类使用关键字class 定义结构使用关键字struct.在语法上其实类和结构有着很多相似的地方.    定义类的语法     1 class Person 2 { 3 private string name; 4

阳尘子的博客 8398

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

c#类与结构的区别

C#类与结构的区别 类和结构都是创建对象的模板,每个对象豆包含数据,并提供了处理和访问数据的方法。 类和结构的区别在于他们在内存中的存储方式和访问方式。首先类的对象存储在托管堆上的引用类型,而结构的数据存储在栈上的值类型。 语法上类和结构非常相似,如下 struct CustomerStruct //结构体存储在栈上的值类型 { public const string day="Monday...

weixin_40786497的博客 241

C#中结构体和类的区别

结构体和类同样能够定义字段,方法和构造函数,都能实例化对象,这样看来结构体和类的功能好像是一样的了,但是他们在数据的存储上是不一样的C#结构体和类的区别问题:这两种数据类型的本质区别主要是各自指向的内存位置不同。传递类的时候,主要表现为是否同时改变了源对象。 1.结构体是值类型,类是引用类型虽然结构体的初始化也使用了new操作符,可是结构体对象依然分配在堆栈上而不是堆上类在传递的时候,传递的内容是...

Arthurian的博客 5172

C#中类与结构体的区别

1、在C#中结构体类型定义时,成员是不能初始化的,这样就导致了,定义结构体变量时,变量的所有成员都要自己赋值初始化。但对于类,在定义类时,就可以初始化其中的成员变量,所以在定义对象时,对象本身就已经有了初始值,你可以自己在重新给个别变量赋值。(注意在C 中,类的定义中是不能初始化的,初始化要放在构造函数中) 2、结构体变量 和类对象 进行值传递时,结构体变量进行的就是值传递,而类对象进行的是引用传递,或者说传递的是指针,这样在函数中改变参数值,结构体对象的值是不变的,而类对象的值是变化了。 下边是.

NEVERGUVEIP的博客 1404

C#类和结构的区别

1、值类型与引用类型 结构是值类型:值类型在堆栈上分配地址,所有的基类型都是结构类型,例如:int 对应System.int32 结构,string 对应 system.string 结构 ,通过使用结构可以创建更多的值类型 ; 类是引用类型:引用类型在堆上分配地址 ; 堆栈的执行效率要比堆的执行效率高,可是堆栈的资源有限,不适合处理大的逻辑复杂的对象。所以结构...

weixin_30451709的博客 116

C#中类与结构的区别

一.类与结构的示例比较: 结构示例: public struct Person { string Name; int height; int weight public bool overWeight() { //implement something } } 类示例: public class TestTime { int hours; int minutes; int seconds

6397

C# 结构体与类的一些区别

C# 结构体与类的一些区别 struct :(1) 直接整个结构体复制(用"="号复制)时,结构体里面的数组是地址复制(非专业用语,但就这样描述吧,下同),数值是数值复制。所以最好不要整个复制。但可以采用一些深度复制函数。结构体不能赋初值,除非是静态的或常量,因此,一般常量或静态量,且不是数组时,才会使用结构体。 (2)结构体里面不能有无输入的构造函数,因为无输入的构造函数是它默认的,不能重载。 (3)构造函数中必须给所有变量赋初值。 (4)使用时,若用到构造函数需要用 new,否则不需要。 class :

blueskynight的博客 234

C#中类与结构体的区别、结构体与枚举的区别详解

​特性​类(Class)​​结构体(Struct)​​枚举(Enum)​​类型引用类型值类型值类型​内存分配堆栈栈​继承支持不支持不支持​适用场景复杂对象、需多态轻量数据、高性能需求有限状态、可读性优先选型原则优先用类实现业务逻辑主体。对小型数据(<16字节)且高频实例化的场景(如游戏开发),选择结构体。需明确语义的常量集合(如状态码),使用枚举替代魔数(Magic Number)

品质生活,极致编程。 651

C# 中类和结构的区别

转角撞倒猪原文C# 中类和结构的区别  

weixin_34162629的博客 107

C# 结构体 和 类 的区别

C#中结构体(struct)是值类型,赋值和传参时复制值本身。结构体适合表示小型简单数据对象(如坐标、颜色),存储在堆栈上,性能较好。与类不同,结构体不支持继承,默认构造函数不可自定义。结构体作为方法参数时传递副本,需使用ref修饰才能传引用修改原值。类(class)是引用类型,存储在堆上,支持继承和自定义构造函数。结构体适用于不需要继承的小型数据对象,类适合更复杂的对象建模。

醉酒的李白、的博客 485
上一篇: C#的6种常用集合类大比拼
下一篇: 关于上下文(Context)
NETZHOU
博客等级 码龄24年 10粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值