struct和class区别小结

仓颉语言 -- 类和接口 阅读详情

说法一:from <<C# in a Nutshell, 2nd Edition>>

A struct is similar to a class, with the following major differences:

A class is a reference type, while a struct is a value type. Consequently, structs are typically used to express simple types, in which value-type semantics are desirable (e.g., assignment copies a value rather than a reference).

A class fully supports inheritance , whereas a struct can inherit only from an object and is implicitly sealed (in the runtime structs actually inherit from System.ValueType). Both classes and structs can implement interfaces.

A class can have a destructor, and a struct cannot.

A class can define a custom parameterless constructor and initialize instance fields, while a struct cannot. The default parameterless constructor for a struct initializes each field with a default value (effectively zero). If a struct declares a constructor(s), then all of its fields must be assigned in that constructor call. 

 

说法二:在jaggersoft上,对此有很详细的解释:

http://www.jaggersoft.com/pubs/StructsVsClasses.htm

C# struct/class Differences

struct Direct
{
    //...
}
class InDirect
{
    //...
}

说法三:http://www.cnblogs.com/hussar/archive/2006/07/03/441747.html

结构与类共享几乎所有相同的语法,但结构比类受到的限制更多:

1、尽管结构的静态字段可以初始化,结构实例字段声明还是不能使用初始值设定项。

2、结构不能声明默认构造函数(没有参数的构造函数)或析构函数。

3、结构的副本由编译器自动创建和销毁,因此不需要使用默认构造函数和析构函数。实际上,编译器通过为所有字段赋予默认值(参见默认值表)来实现默认构造函数。结构不能从类或其他结构继承。

4、结构是值类型——如果从结构创建一个对象并将该对象赋给某个变量,变量则包含结构的全部值。复制包含结构的变量时,将复制所有数据,对新副本所做的任何修改都不会改变旧副本的数据。由于结构不使用引用,因此结构没有标识--具有相同数据的两个值类型实例是无法区分的。C# 中的所有值类型本质上都继承自 System.ValueType,后者继承自 Object。

编译器可以在一个称为装箱的过程中将值类型转换为引用类型。

结构具有以下特点:

  • 结构是值类型,而类是引用类型。
  • 向方法传递结构时,结构是通过传值方式传递的,而不是作为引用传递的。
  • 与类不同,结构的实例化可以不使用 new 运算符。
  • 结构可以声明构造函数,但它们必须带参数。
  • 一个结构不能从另一个结构或类继承,而且不能作为一个类的基。
  • 所有结构都直接继承自 System.ValueType,后者继承自 System.Object。
  • 结构可以实现接口。

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

现在引出问题

1、如果结构是值类型,但是结构成员可以是类,也就是说这个时候结构怎么分配内存呢?

  结构的副本由编译器自动创建和销毁,也就是说结构在编译的时候就确定了存储空间了,不是在运行时到托管堆里面去分配内存。所以结构成员的类成员其实是保存的这个类的实例的地址。

2、那struct的new操作又是干什么的呢?

操作就是执行initobj指令,功能就是将位于指定地址的对象的所有字段初始化为空引用或适当的基元类型的0。如果是类的话实例化new的指令实际是newobj instance。所以class的new操作和struct的new操作是不一样的。

像下面这个结构

public struct TestStruct

{

public int n;

public string s;

public StringBuilder sb;

}

当他

TestStruct t = new TestStruct();

new的时结果是什么?其结果就是int类型被初始化为0,对象全部被置为null。

结论

struct的new操作是不执行分配内存操作的,其new操作只执行初始化数据操作。所以微软关于new关键字的用途的说法是不全面的。因为new还有一种只初始化数据而不在托管堆分配内存的功能。所以值类型和引用类型的实质我个人认为其实就是在什么时候分配内存和其传值调用方式。

注1

MSDN对new关键字用途的说法:

(1)new运算符
用于创建对象和调用构造函数。
(2)new修饰符
用于向基类成员隐藏继承成员。
(3)new约束
用于在泛型声明中约束可能用作类型参数的参数的类型。

注2

System.ValueType本来就是比较怪的一个东西。
.NET的编译器在处理他的时候是
1、把值存在计算堆栈上,这个是值类型的标准操作。
2、产生一个装箱操作如果初始化的是一个33这样的整数,那就装箱一个int32同理如果是3.3就是float。
3、执行一个stloc从计算堆栈的顶部弹出当前值并将其存储到指定索引处的局部变量列表中。
个人理解:System.ValueType更像是一个系统内置接口(当然应该不是真的接口)。而接口在平台当中不管是Java还是.NET都意味着一旦继承了这种系统内置接口,就会响应系统内部的某种处理或调用。

 

class和struct浅谈 class和struct 阅读详情

相关推荐

[SC]C++ 中 struct vs. class 的唯一区别

SystemC使用struct而非class定义模块主要是出于简洁性和便利性考虑。在C++中,struct和class功能相同,唯一区别是struct默认成员和继承为public,而class默认为private。SystemC的SC_MODULE宏展开为struct继承sc_module,自动将所有端口、信号和进程设为public,省去手动声明。这种设计符合硬件建模需求,因为模块成员通常需要公开访问。若使用class则需手动添加public修饰,写法更繁琐。本质上这是风格选择,功能上二者等价。

元直的博客 591

关于C#中 struct使用new 初始化

C#中对于struct我们进行初始化时可以使用new 语句 例如有一个结构体Point struct Point { float  x; float y; } 我们将其实例化时可以使用语句: Point p = new Point(); 这不同于类使用new 语句,我们知道对一个类使用new语句会在托管堆上分配空间,而struct是值类型所以应该在栈上为其分配空间。 实际上,以...

LuckyJoey的博客 1万+

ST7102驱动移植与调试实战

本文详细介绍了在君正T40平台上移植和调试ST7102 LCD驱动芯片的实战经验。内容涵盖硬件接口配置、时序参数调整、寄存器初始化序列编写及常见问题解决,重点解析了ST7102单芯片集成显示与触控功能的特性,为嵌入式设备显示驱动开发提供实用指南。

k6l7m8n9的博客 1410

NX二次开发避坑指南:手把手教你实现‘移动/复制’功能时,如何正确处理矩阵和向量运算

本文深入解析NX二次开发中几何变换的核心技术,重点介绍如何正确处理矩阵和向量运算以实现‘移动/复制’功能。通过详细讲解坐标系转换、向量运算陷阱及变换矩阵构建技巧,帮助开发者避免常见错误,提升开发效率。特别针对‘点到点’移动功能的实现提供了实用解决方案。

weixin_30319153的博客 376

在中国大陆使用 LiveKit 集成阿里云语音交互服务

通过集成阿里云的语音和模型服务,我们可以快速构建出适合中国用户的 LiveKit 智能语音应用。LiveKit Agents 框架的模块化设计使得替换底层服务变得异常简单,只需要更换相应的插件实例即可。使用 WebSocket 版本的阿里云 ASR 接口以获得更低的延迟。利用通义千问的 Function Calling 能力对接智能家居或企业内部 API。结合 LiveKit 的视频处理能力,打造具备视觉交互的数字人。希望这篇博客能为你在实时音视频与 AI 结合的探索之路上提供帮助!

星空漫野 1236

告别手动打点计时:用Lauterbach TRACE32的RunTime功能,5分钟搞定嵌入式代码段性能分析

本文深入解析了Lauterbach TRACE32的RunTime功能在嵌入式代码性能分析中的革命性应用。通过硬件级计时原理和非侵入式设计,该功能能快速精确测量代码执行时间,显著提升开发效率,特别适用于汽车电子和工业控制领域。文章还提供了从基础设置到高级分析的完整实战指南,帮助工程师轻松掌握这一强大工具。

weixin_30615767的博客 277

C/C++:struct 和 class 的区别

汇总 struct 是值类型,class 是对象类型 struct 默认的访问权限是 public,而class 默认的访问权限是 private. struct 总是有默认的构造函数,即使是重载默认构造函数仍然会保留。这是因为 struct 的构造函数是由编译器自动生成的,但是如果重载构造函数,必需对 struct 中的变量全部初始化。并且 struct 的用途是那些描述轻量级的对象,例如 Line,Point 等,并且效率比较高。class 在没有重载构造函数时有默认的无参数构造函数,但是一被重载些默

SongXJ的博客 508

6 赫斯曼网管软件industrial hivision用户管理

文章目录前言一、打开Industrial HiVision服务器二、在用户管理界面添加策略三、使用可选策略四、接受策略总结 前言 安装 Industrial HiVision 后,所有人都能广泛使用程序。安全起见,请进行相 关配置,对访问权限进行限制。 本文主要介绍用户管理基于某种角色模型。在访问角色中定义角色名称,通过分配访问权限给这些角色分配角色功能。例如,给管理人员自然要分配可用的权限,而观察员尽管可以登录,但没有能够进行更改的权限。Industrial HiVision 提供以下访问角色: 

t98746194的博客 1378

仓颉编程语言入门 -- 类的介绍

具体到实现上,我们首先定义一个class,然后可以通过new关键字创建该类的实例(即对象)。对象创建后,可以访问其公有成员(包括属性和方法),并进行相应的操作。如果类之间存在继承关系,子类可以重写继承自父类的虚方法,或者添加新的成员和方法。这种继承机制促进了代码的复用和扩展性。简而言之,class和struct在面向对象编程中各有其用,但class由于其支持引用传递和继承的特性,在构建复杂系统时更为常用。ps : class 只能定义在源文件顶层。

几许的博客 2089

AUTOSAR Dem模块实战配置:从理论到代码生成的完整指南

本文提供了一份AUTOSAR Dem模块从理论到代码生成的完整实战配置指南。文章详细拆解了配置流程,涵盖Dem模块的核心角色、通用骨架搭建、事件与DTC映射、消抖机制配置,以及与BswM、EcuM、DCM等模块的联调方法,旨在帮助汽车电子工程师快速掌握诊断事件管理的关键配置步骤,生成可运行的代码。

3c4x5z6v7b的博客 455

GEE:连续变化检测 CCDC 提取断点信息(干扰时间、干扰幅度、干扰次数)

本文将介绍在 Google Earth Engine (GEE) 平台上连续变化检测与分类(Continuous Change Detection and Classification, CCDC)提取扰动时间、干扰幅度、干扰次数信息,并下载到本地的代码。

养乐多的博客 1945

c++中struct和class的区别小结

在C++中,class和struct都是用于定义自定义数据类型的关键字,但它们之间有一些区别。这些区别主要涉及成员的默认访问权限和继承。

m0_74824865的博客 185

LangChain从入门到精通最全教程

LangChain是一个用于构建基于大语言模型(LLM数据感知:连接外部数据源(文档、API等)智能代理:通过工具调用实现自主决策模块化设计:支持链式调用、记忆管理、提示词工程等from langchain . llms import BaseLLM class CustomLLM(BaseLLM) : def _call(self , prompt : str , ** kwargs) - > str : return f"自定义响应: {

Cachel Wood的博客 1409

转:struct和class区别小结

A struct is similar to a class, with the following major differences: A class is a reference type, while a struct is a value type. Consequently, structs are typically used to express simple types, i

xueyong4712816的专栏 659

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS)

【华为OD机试真题 新系统】1043、魔法咒语组合 | 机试真题+思路参考+代码解析(C++、Java、Py、C语言、JS) 华为od机试,华为od机试真题,华为od机试E卷,华为odE卷,华为od机试真题E卷,华为OD,华为OD机试,华为OD机试真题,华为od机考,华为od机试D卷,华为od机试真题D卷,华为od手撕代码,华为od,华为od机试C卷,华为od e卷,华为2026e卷,od机试,2026E卷,华为OD机试E卷,什么是华为od,华为od介绍,全面了解华为od,2026华为od,如何备战华为od

KJ.JK 281

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

struct 和 class 的异同

struct 和 class 的异同

威桑的博客 590

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

class与struct

class与struct

CXYLVCHF的博客 1124

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

c++ class struct同名_C++中的struct完全可以被class替代,为什么不删去它呢?

我有相当长的一段时间(数月)没有更新文章了。并不是我放弃了写技术文章,而是因为这段时间,我把精力主要放在了图像智能算法的学习上了。去年12月时,我对图像智能算法还懵懵懂懂,做着 Linux 嵌入式应用程序开发,现在我已经正式入职到算法公司了,收入翻了一番,哈哈,不过累了好多。废话就到这里,我的转行辛酸史,以后再详谈。转行啦坦诚的说,就编程语言而言,因为一直在做 Linux 嵌入式程序开发的缘故,我...

weixin_39907157的博客 472

java struct关键字_C++中的struct与class关键字

之前因为都在忙着毕业的开题答辩与投稿论文的事宜,一直没有时间更新这个系列的文章。师弟看了上一篇雾中风景的文章,希望我继续把这个系列的文章写下去。坦白说,C++的特性很多,这也不是教学指南的文章,我会选取一些自己在学习C++过程之中值得探讨的问题和大家聊一聊,来抛砖引玉。好的,今天先放点开胃菜,和大家聊聊struct与class关键字。1.struct关键字:在C++语言作为C语言的一个超集,是兼容...

weixin_39604478的博客 414

C#中类和结构的区别(class和struct)

1、Class是引用类型;Struct是值类型 2、Class可以实现单继承,实现接口;Struct只能实现接口 3、Class可以有无参构造函数;Struct不可以定义无参构造函数,因为编译器默认给他创建了一个无参构造函数 4、Class在定义的时候可以为成员的赋值;Struct只能通过构造函数赋值 5、Class的构造函数不需要初始化全部字段;Struct的构造函数必须初始化所有字段

code旅行者的专栏 2108

C++雾中风景2:struct还是class?

之前因为都在忙着毕业的开题答辩与投稿论文的事宜,一直没有时间更新这个系列的文章。师弟看了上一篇雾中风景的文章,希望我继续把这个系列的文章写下去。坦白说,C++的特性很多,这也不是教学指南的文章,我会选取一些自己在学习C++过程之中值得探讨的问题和大家聊一聊,来抛砖引玉。好的,今天先放点开胃菜,和大家聊聊strcut与class关键字。 1.struct关键字: 在C++语言作为C语言...

a89677418的博客 127

C#与C++中struct和class的小结

在C#中,struct其实也是可以像class一样封装方法和数据的。请参考如下代码。 1 using System; 2 3 namespace testDiffInStructClass 4 { 5 public struct father 6 { 7 //private string _name = "father"; ...

weixin_30321709的博客 112

C++解析(10):struct和class的区别

0.目录 1.默认访问级别 2.默认继承方式 2.1 分别独立继承 2.2 struct继承class 2.3 class继承struct 3.小结 1.默认访问级别 在用struct定义类时,所有成员的默认访问级别为public 在用class定义类时,所有成员的默认访问级别为private 2.默认继承方式 2.1 分别独立继承 struct继承struct时,默认继承方式为pub...

weixin_30505751的博客 122

c++ class struct同名_相对于C语言,C++对struct做了非常多的扩充,功能更全面了

我有相当长的一段时间(数月)没有更新文章了。并不是我放弃了写技术文章,而是因为这段时间,我把精力主要放在了图像智能算法的学习上了。去年12月时,我对图像智能算法还懵懵懂懂,做着 Linux 嵌入式应用程序开发,现在我已经正式入职到算法公司了,收入翻了一番,哈哈,不过累了好多。废话就到这里,我的转行辛酸史,以后再详谈。转行啦坦诚的说,就编程语言而言,因为一直在做 Linux 嵌入式程序开发的缘故,我...

weixin_39752941的博客 220

C++的结构体(struct)和类(class)对比

C++的结构体(struct)和类(class)对比

cnds123的专栏 767
上一篇: 转载:优快云、cnblogs使用Windows Live Writer客户端发布日志时相关配置
下一篇: 面向对象编程初释
changesway
博客等级 码龄19年 50粉丝 30原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值