C#——类与结构

embedded/2024/12/23 6:01:06/

在未学习面向对象语言时,我常常将类比作一种结构体,其实类与结构体也确实很相似,类用来做函数的集合,结构用来做变量的集合,接下来将从几个角度刨析类与结构的不同。

类 vs 结构

类和结构在设计和使用时有不同的考虑因素,类适合表示复杂的对象和行为,支持继承和多态性,而结构则更适合表示轻量级数据和值类型,以提高性能并避免引用的管理开销。

类和结构有以下几个基本的不同点:

值类型 vs 引用类型:

  • 结构是值类型(Value Type): 结构是值类型,它们在栈上分配内存,而不是在堆上。当将结构实例传递给方法或赋值给另一个变量时,将复制整个结构的内容。
  • 类是引用类型(Reference Type): 类是引用类型,它们在堆上分配内存。当将类实例传递给方法或赋值给另一个变量时,实际上是传递引用(内存地址)而不是整个对象的副本。

继承和多态性:

  • 结构不能继承: 结构不能继承其他结构或类,也不能作为其他结构或类的基类。
  • 类支持继承: 类支持继承和多态性,可以通过派生新类来扩展现有类的功能。

默认构造函数:

  • 结构不能有无参数的构造函数: 结构不能包含无参数的构造函数(不带传参的)。每个结构都必须有至少一个有参数的构造函数(有传参的)。
  • 类可以有无参数的构造函数: 类可以包含无参数的构造函数(不带传参的),如果没有提供构造函数,系统会提供默认的无参数构造函数。

名词解释:构造函数(Constructor)是一种特殊的方法,主要用于在创建对象时初始化对象(构造函数的主要目的是在对象被创建时设置对象的初始状态或初始值。)。

赋值行为:

  • 类型为类的变量在赋值时存储的是引用,因此两个变量指向同一个对象。
  • 结构变量在赋值时会复制整个结构,因此每个变量都有自己的独立副本。

传递方式:

  • 类型为类的对象在方法调用时通过引用传递,这意味着在方法中对对象所做的更改会影响到原始对象。
  • 结构对象通常通过值传递,这意味着传递的是结构的副本,而不是原始结构对象本身。因此,在方法中对结构所做的更改不会影响到原始对象。

可空性:

  • 结构体是值类型,不能直接设置为 null因为 null 是引用类型的默认值,而不是值类型的默认值。如果你需要表示结构体变量的缺失或无效状态,可以使用 Nullable<T> 或称为 T? 的可空类型。
  • 类默认可为null: 类的实例默认可以为 null,因为它们是引用类型。
  • 性能和内存分配:

  • 结构通常更轻量: 由于结构是值类型且在栈上分配内存,它们通常比类更轻量,适用于简单的数据表示。
  • 类可能有更多开销: 由于类是引用类型,可能涉及更多的内存开销和管理。
using System;
using System.Text;struct Books
{private string title;private string author;private string subject;private int book_id;public void setValues(string t, string a, string s, int id){title = t;author = a; subject = s;book_id = id;}public void display(){Console.WriteLine("Title : {0}", title);Console.WriteLine("Author : {0}", author);Console.WriteLine("Subject : {0}", subject);Console.WriteLine("Book_id :{0}", book_id);}
};
public class testStructure
{public static void Main(string[] args){Books Book1 = new Books(); /* 声明 Book1,类型为 Books */Books Book2 = new Books(); /* 声明 Book2,类型为 Books *//* book 1 方法调用 */Book1.setValues("C Programming","Nuha Ali", "C Programming Tutorial", 6495407);/* book 2 方法调用 */Book2.setValues("Telecom Billing","Zara Ali", "Telecom Billing Tutorial", 6495700);/* 打印 Book1 信息 */Book1.display();/* 打印 Book2 信息 */Book2.display();Console.ReadKey();}}


http://www.ppmy.cn/embedded/104470.html

相关文章

常使用的前端构建优化策略

在前端开发中&#xff0c;构建优化是提升网站或应用性能、提高用户体验的重要手段。以下是一些常用的前端构建优化策略&#xff0c;它们涵盖了代码优化、资源加载优化、缓存利用、网络优化等多个方面。 一、代码优化 1. 精简代码 移除冗余代码&#xff1a;检查并删除未使用的…

音视频入门基础:WAV专题(7)——FFmpeg源码中计算WAV音频文件每个packet的size值的实现

一、引言 从文章《音视频入门基础&#xff1a;WAV专题&#xff08;6&#xff09;——通过FFprobe显示WAV音频文件每个数据包的信息》中我们可以知道&#xff0c;通过FFprobe命令可以显示WAV音频文件每个packet&#xff08;也称为数据包或多媒体包&#xff09;的信息&#xff0…

在Ubuntu上使用apt工具安装RabbitMQ

创建安装脚本 cd home/ madir scripts cd scripts 创建脚本前&#xff0c;需要确认Linux版本。不同的版本对应着不同的运行脚本。 lsb_release -a 查看Linux版本 可以看到&#xff0c;我的Ubuntu版本是22.04。 在这里找到对应的脚本复制。 创建脚本文件&#xff1a; ca…

驱动开发系列17 - PCI总线

一:概述 PCI(外设计算机互连)或PCIe总线是现代计算机的主要组成部分,了解它的工作原理对于理解许多Linux设备驱动程序非常重要。 关于PCI总线本身有很多好的信息(在维基百科和其他地方),而Linux内核中也有关于PCI处理子系统实际实现的文档。然而,这两种现有来源…

单片机中的定时器:精确时间的掌控者

在单片机的世界里&#xff0c;定时器就像是一个精确的时间守护者&#xff0c;默默地为各种任务提供准确的时间基准。从简单的定时功能到复杂的实时控制系统&#xff0c;定时器都发挥着至关重要的作用。本文将深入探讨单片机中的定时器&#xff0c;包括其工作原理、应用场景以及…

python网络爬虫(四)——实战练习

0.为什么要学习网络爬虫 深度学习一般过程:   收集数据&#xff0c;尤其是有标签、高质量的数据是一件昂贵的工作。   爬虫的过程&#xff0c;就是模仿浏览器的行为&#xff0c;往目标站点发送请求&#xff0c;接收服务器的响应数据&#xff0c;提取需要的信息&#xff0c…

前端速通面经八股系列(一)—— CSS篇

CSS高频面经目录 一、CSS基础1. CSS选择器及其优先级2. CSS中可继承与不可继承属性有哪些3. display的属性值及其作用4. display的block、inline和inline-block的区别5. 隐藏元素的方法有哪些6. link和import的区别7. transition和animation的区别8. display:none与visibility:…

今日早报 每日精选15条新闻简报 每天一分钟 知晓天下事 9月2日,星期一

每天一分钟&#xff0c;知晓天下事&#xff01; 2024年9月2日 星期一 农历七月三十 1、 2024年中非合作论坛峰会将于9月4日至6日在北京举行&#xff0c;多国总统抵京。 2、 铁路新规&#xff1a;明确旅客在开车前和开车后当日均可改签预售期内车票。 3、 证监会&#xff1a;在…