C#——结构和类问题总结

C#——结构和类问题总结

  • 前言
  • 一、结构体是什么?
    • 1)定义
    • 2)特点
  • 二、类(对象)是什么?
    • 1)定义
    • 2)特点
  • 三、两者的差异性与选择环境?
    • 1)差异性
    • 2)选择环境
  • 总结


前言

很久没有更新,C#相关的东西了,项目中正好碰到结构体和类对象,在此做梳理总结,对比两个的差异,从而引导出项目中区别使用的地方。


一、结构体是什么?

结构体(struct)是C#中的一种值类型,用于定义一个数据结构,其中可以包含字段、方法、属性、事件、运算符、索引器等成员。

1)定义

public struct Point
{public int X { get; set; }public int Y { get; set; }public Point(int x, int y){X = x;Y = y;}public void Display(){Console.WriteLine($"X: {X}, Y: {Y}");}
}

2)特点

  • 值类型
    结构体是值类型,分配在栈上,而不是堆上。当结构体变量被赋值给另一个变量时,实际的数据会被复制,而不是引用。这意味着对一个结构体变量的修改不会影响另一个结构体变量。
  • 无继承
    结构体不能从其他结构体或类继承,但是可以实现接口
  • 内存高效
    由于结构体在栈上分配内存,因此在处理小型数据对象时,结构体通常比类更高效
  • 默认构造函数
    每个结构体都有一个隐式的无参构造函数,该构造函数会将所有字段初始化为其默认值。你不能定义一个显式的无参构造函数,但可以定义有参数的构造函数
  • 初始化要求
    在使用结构体实例之前,必须初始化所有字段,否则会导致编译错误。

二、类(对象)是什么?

类(class)是C#中的一种引用类型,用于定义对象的模板。它封装了数据和行为,可以包含字段、属性、方法、事件,运算符等成员。类是面向对象编程(OOP)的基础,可以通过继承和多态等特性来实现代码的重用和扩展。

1)定义

public class Person
{public string Name { get; set; }public int Age { get; set; }public Person(string name, int age){Name = name;Age = age;}public void Display(){Console.WriteLine($"Name: {Name}, Age: {Age}");}
}

2)特点

  • 引用类型
    类是引用类型,实例化时存储在堆上。当一个类的实例被传递给另一个变量时,两个变量引用的是同一个对象,因此对其中一个变量的修改会影响另一个变量
  • 继承
    类支持继承,可以有一个基类(父类)和多个派生类(子类)。通过继承,子类可以重用父类的代码,并可以重写或扩展父类的行为
  • 多态性
    通过继承和接口,类可以实现多态性,允许使用基类类型的变量来引用派生类的对象,从而实现灵活的代码设计。
  • 构造函数
    类可以有一个或多个构造函数,用于在创建对象时初始化对象的状态。如果没有定义构造函数,编译器会提供一个默认的无参构造函数。
  • 垃圾回收
    类实例的内存由垃圾回收器管理,当对象不再被引用时,垃圾回收器会自动释放内存

三、两者的差异性与选择环境?

1)差异性

由上述描述的来看我们不难发现以下几点:

  • 类型差异:
    结构体是值类型,类是引用类型。我们延伸以下:
    a.回收上:值类型脱离域后自动释放,引用类型需要等待GC管理。
    b.性能上:结构在栈上内存分配和释放更高效,类在堆上分配和回收内存的开销较大。
    c.传递方式上:值类型传递时是数据副本传递,副本修改不影响源数据。引用类型是传递引用,对引用改变源数据也会改变。
  • 继承差异:
    结构体只能实现接口,无法继承其他结构体。
    类能实现接口,也支持继承,可以有基类和派生类。
  • 构造差异:
    结构体有隐式的无参构造函数,但不能显式定义无参构造函数。在使用结构体实例之前完全初始化所有字段,否则会导致编译错误。
    类可以有显式定义的无参构造函数和有参构造函数。可不实例化默认值为null。

2)选择环境

通过上述分析不同后,可对应下面的场景。
选择类

  • 需要引用语义时(多个引用指向同一个实例)。
  • 需要继承和多态时。
  • 实例的生命周期较长,且大小较大时。

选择结构体

  • 需要值语义时(副本之间相互独立)。
  • 数据结构较小且简单时。
  • 实例的生命周期较短,且频繁创建和销毁时。

总结

类和结构体在C#中有各自的适用场景。类适用于复杂、需要引用语义的数据结构,而结构体适用于小型、简单且频繁操作的数据结构。了解它们上述的差异和使用场景,可以帮助我们在开发过程中做出更好的设计选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/853836.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一款WPF绘图插件OxyPlot

开始 使用 NuGet 包管理器添加对 OxyPlot 的引用(如果要使用预发布包,请参阅下面的详细信息)向用户界面添加PlotView在代码中创建一个PlotModel绑定到你的属性PlotModelModelPlotView例子 您可以在代码存储库的文件夹中找到示例。/Source/Examples NuGet 包 最新的预发布包由…

前端工程师不是软件工程师?

在当前的技术生态系统中,前端工程师与软件工程师这两个角色经常被混淆。尽管它们在某些方面有重叠,但实际上存在显著的差异。尤其是在前端工程师培训班出身的背景下,这种差异更为明显。本文将探讨为什么前端工程师不应被简单地归类为软件工程…

CyberDAO:引领Web3时代的DAO社区文化

致力于Web3研究和孵化 CyberDAO自成立以来,致力于推动Web3研究和孵化,吸引了来自技术、资本、商业、应用与流量等领域的上千名热忱成员。我们为社区提供多元的Web3产品和商业机会,触达行业核心,助力成员捕获Web3.0时代的红利。 目…

C语言---------深入理解指针

目录 一、字符指针 二、指针数组: 三、数组指针: 1、定义: 2、&数组名和数组名区别: 3、数组指针的使用: 四、数组参数,指针参数: 1、一维数组传参: 2、二维数组传参&am…

后端防接口被刷

1)防火墙 防火墙也是互联网安全攻防中重要的屏障,我们通过配置访问规则,可以限制只有被允许的IP才可以进行访问。 防火墙还可以识别和阻止DDoS攻击,通过识别并过滤恶意流量请求,防火墙可以有效的防御,保护…

模拟电子技术基础(二)--PN结

PN结的本质 芯片都是由硅晶体制成,单个硅原子最外层有带有4个电子 在纯硅当中这些电子会两两形成共价键,此时周围形成非常稳定的八电子结构 在一个回路中,灯泡不亮,不导通,因为电池无法吸引其中的电子离开&#xff0c…

面向对象程序设计》第5章 多态(选择 判断 填空)

1-1 在类的定义中,前面有virtual关键字的成员函数就是虚函数。 T F | 参考答案 答案 T 2分 1-2 通过基类指针调用基类和派生类中的同名虚函数时,若该指针指向一个基类的对象,那么被调用的是基类的虚函数。 T F | 参考答案 答案 T 2分 1-3 通过基类指针调用…

Zombie Animations Set

僵尸动画合集,包括成对攻击/抓取、各种移动方式、爬行、击中反应、死亡动画等。 生产说明 动画总数:99(包括22个位置变化) 配对动画:36 攻击次数:6次 爬网:9 命中反应:6 空转:14 行程2 跑步次数:9次 短跑:2 匝数:3 步行次数:12次 免责声明 任何游戏玩法蓝图都不包…

【JavaScript】MDN

一、初识 1.1 基础 1.1.1 语言速成课 1.1.1.1 变量 ​ 变量是存储值的容器。首先用let关键字声明一个变量,后面跟着你给变量的名字 ​ 变量命名区分大小写 ​ 分号在JavaScript中是用来分隔语句的,但是如果语句后面有一个换行符(或者在{block}中只…

力扣每日一题 6/16 字符串 + 随机一题 动态规划/数学

博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 521.最长特殊序列 I【简单】 题目: 给你两个字符串 a 和 b&am…

【猫狗分类】Pytorch VGG16 实现猫狗分类4-开始训练

背景 现在,我们已经完成了,数据集的清洗,标签的制作,也把VGG16的模型建立好了。那接下来,我们应该把数据,放到我们搭建的vgg16的模型里面,让模型针对这些猫和狗的图片,去进行训练&a…

面试题 17.17. 多次搜索

链接&#xff1a;. - 力扣&#xff08;LeetCode&#xff09; 题解&#xff1a; class Solution { private:struct Trie {Trie() {end false;index -1;next.resize(26);}bool end;int index;std::vector<std::unique_ptr<Trie>> next;};void insert_trie(int in…

5.3.2_1 线索二叉树的概念

&#x1f44b; Hi, I’m Beast Cheng &#x1f440; I’m interested in photography, hiking, landscape… &#x1f331; I’m currently learning python, javascript, kotlin… &#x1f4eb; How to reach me --> 458290771qq.com 喜欢《数据结构》部分笔记的小伙伴可以…

接口和抽象类:如何使用普通类模拟接口和抽象类

目录 1.引言 2.抽象类和接口的定义与区别 3.抽象类和接口存在的意义 4.模拟实现抽象类和接口 5.抽象类和接口的应用场景 1.引言 在面向对象编程中&#xff0c;抽象类和接口是两个经常被提及的语法概念&#xff0c;也是面向对象编程的四大特性&#xff0c;以及很多设计模式…

借报告Team ID错误谈谈Mac app文件签名与公证

文章目录 目的起因流程熟悉本地证书、认证证书申请在钥匙串中创建要公证app的profile(公证的时候会用到)程序打包后App文件进行app签名压缩打包公证公证变化在WWDC19, 苹果在MacOS 10.14之后引入了公证(Notarization)这一机制来提升安全性. 主要分以下几步新的公证workflow公…

使用KVM制作镜像

资源列表 操作系统 IP Centos7&#xff0c;桌面版 192.168.10.57 安装KVM 安装软件包 yum -y install qemu-kvm qemu-kvm-tools qemu-img bridge-utils libvirt virt-install virt-manager 检查有否支持虚拟化 grep -e vmx -e svm /proc/cpuinfo #VMX是英特尔版本&…

【CT】LeetCode手撕—88. 合并两个有序数组

目录 题目1- 思路2- 实现⭐88. 合并两个有序数组——题解思路 2- ACM实现 题目 原题连接&#xff1a;88. 合并两个有序数组 1- 思路 模式识别 模式1&#xff1a;两个有序数组合并 ——> 双指针模式2&#xff1a;返回结果填充到 nums1[mn] ——> 需要开辟新的数组空间 …

lxml库在爬虫领域的贡献及应用

重头戏lxml库里面的xpath 一段代码给各位开开胃 这段代码首先导入了lxml库中的etree模块&#xff0c;然后定义了一个包含HTML内容的字符串html。接着&#xff0c;我们使用etree.HTML()函数解析这个HTML字符串&#xff0c;得到一个表示整个HTML文档的树形结构。最后&#xff0c;…

C# 字段 属性 索引器

字段声明字段字段初始化静态字段常量字段只读字段字段的访问然而 属性声明属性自动实现的属性只读属性只写属性属性的逻辑处理属性的访问修饰符属性和字段的区别属性的用途总结 索引器索引器的基本语法使用索引器索引器的关键点语法参数访问和设置异常处理性能重载使用场景封装…

qt 实现模拟实际物体带速度的移动(水平、垂直、斜角度)——————附带完整代码

文章目录 0 效果1 原理1.1 图片旋转1.2 物体带速度移动 2 完整实现2.1 将车辆按钮封装为一个类&#xff1a;2.2 调用方法 3 完整代码参考 0 效果 实现后的效果如下 可以显示属性&#xff08;继承自QToolButton&#xff09;: 鼠标悬浮显示文字 按钮显示文字 1 原理 类继承…