C# 结构体介绍


.NET学习资料

.NET学习资料

.NET学习资料


一、结构体的定义与基本使用

(一)定义结构体

在 C# 中,使用struct关键字来创建结构体。它就像是一个模板,能定义出符合特定需求的数据结构。比如,若要跟踪图书馆中书的信息,可定义如下Books结构体:

struct Books
{public string title;public string author;public string subject;public int book_id;
}

在这个结构体定义中,包含了表示书籍标题(title)、作者(author)、主题(subject)以及书籍编号(book_id)的成员变量,类型分别为string和int ,通过这些成员变量可以全面描述一本书的关键属性。

(二)结构体的使用示例

下面是一个完整展示结构体用法的程序示例:

using System;struct Books
{public string title;public string author;public string subject;public int book_id;
};public class testStructure
{public static void Main(string[] args){// 声明两个Books类型的结构体变量Book1和Book2Books Book1; Books Book2; // 为Book1的各个成员变量赋值Book1.title = "C Programming";Book1.author = "Nuha Ali";Book1.subject = "C Programming Tutorial";Book1.book_id = 6495407;// 为Book2赋值Book2.title = "Telecom Billing";Book2.author = "Zara Ali";Book2.subject = "Telecom Billing Tutorial";Book2.book_id = 6495700;// 打印Book1的详细信息Console.WriteLine("Book 1 title : {0}", Book1.title);Console.WriteLine("Book 1 author : {0}", Book1.author);Console.WriteLine("Book 1 subject : {0}", Book1.subject);Console.WriteLine("Book 1 book_id :{0}", Book1.book_id);// 打印Book2的详细信息Console.WriteLine("Book 2 title : {0}", Book2.title);Console.WriteLine("Book 2 author : {0}", Book2.author);Console.WriteLine("Book 2 subject : {0}", Book2.subject);Console.WriteLine("Book 2 book_id : {0}", Book2.book_id);Console.ReadKey();}
}

上述代码编译并执行后,输出结果如下:

Book 1 title : C Programming
Book 1 author : Nuha Ali
Book 1 subject : C Programming Tutorial
Book 1 book_id : 6495407
Book 2 title : Telecom Billing
Book 2 author : Zara Ali
Book 2 subject : Telecom Billing Tutorial
Book 2 book_id : 6495700

从示例中能清晰看到,通过结构体变量可方便地访问和操作其内部各个成员变量,分别对不同书籍信息进行赋值和展示,体现了结构体在组织和管理相关数据方面的便利性。

二、C# 结构的特点

(一)丰富的成员类型

结构体不仅能存储简单数据,还可带有方法、字段、索引、属性、运算符方法和事件等多种成员类型。这使其能适用于表示各种轻量级数据,如坐标(包含 x 和 y 坐标值的结构体,搭配方法进行坐标运算等操作)、范围(定义包含起始值和结束值的结构体,以及判断是否包含某个值的方法等)、日期、时间等。

(二)构造函数相关限制与特性

结构体可以定义构造函数,但不能定义析构函数 。并且,结构体不能定义无参构造函数,无参构造函数(默认)由系统自动定义,且不能手动改变。例如:

struct Point
{public int X;public int Y;// 合法的有参构造函数public Point(int x, int y){X = x;Y = y;}// 以下是非法的无参构造函数定义,结构体不允许这样写// public Point()// {// }
}

(三)继承方面的限制

结构体不能继承其他的结构或类,也不能作为其他结构或类的基础结构。这意味着结构体在继承体系方面相对独立,更侧重于简单地封装和处理自身内部定义的数据和相关逻辑,不像类那样能通过继承扩展功能、实现多态等复杂的面向对象设计模式。

(四)接口实现能力

虽然结构体不能参与继承关系,但它具备实现一个或多个接口的能力。通过实现接口,结构体可以遵循接口中定义的契约,从而获得特定的行为和功能。例如,若定义一个包含计算面积方法的接口,结构体可以实现该接口来提供面积计算的具体实现。

(五)成员修饰符限制

结构体中的成员默认是public的,也可以使用其他访问修饰符,如private、protected等,但相比类,其使用场景和限制有所不同。例如,在结构体中使用private修饰成员时,需要通过属性或方法来访问这些私有成员,以确保数据的安全性和封装性。

(六)实例化与初始化特点

在实例化结构体时,可以使用构造函数进行初始化,也可以在声明后分别对成员进行赋值。例如:

Point p1 = new Point(10, 20);
Point p2;
p2.X = 30;
p2.Y = 40;

(七)内存分配与性能特点

结构体是值类型,通常在栈上分配内存(在某些情况下,如作为类的成员时,可能会随类一起在堆上分配)。这使得结构体在传递和使用时,是按值复制的,在处理小数据结构且频繁复制或传递时,性能表现较好,能减少内存分配和垃圾回收的开销。但如果结构体过大,值传递时会产生较大性能开销。

(八)可变性特点

结构体默认是可变的,即其成员的值可以在创建后被修改。不过,也可以通过将结构体设计为不可变(所有成员为只读或通过特定设计保证不可修改)来提高其在多线程环境中的安全性,避免数据竞争问题。

三、类 vs 结构

(一)值类型 vs 引用类型

结构体是值类型,在栈上分配内存(特殊情况除外),赋值或传递时是按值复制;类是引用类型,对象在堆上分配内存,赋值或传递时传递的是对象的引用。

(二)继承和多态性

结构体不支持继承,不能从其他结构体或类继承,也不能被其他结构体或类继承;类支持继承和多态,可以通过继承实现代码复用和多态行为。

(三)默认构造函数

结构体隐式地具有一个无参数的默认构造函数,将所有字段初始化为默认值,但不能手动定义无参构造函数;类可以显式地定义默认构造函数或其他构造函数。

(四)赋值行为

结构体赋值时,会创建一个新的副本,两个变量相互独立;类赋值时,只是复制引用,两个变量指向同一个对象,对其中一个变量的修改会影响另一个。

(五)传递方式

结构体作为方法参数传递时,是按值传递,方法内对参数的修改不会影响外部变量;类作为方法参数传递时,是按引用传递,方法内对参数的修改会影响外部变量。

(六)可空性

结构体本身不可空,但可以通过Nullable类型使其可空;类本身就是引用类型,默认可以为null。

(七)性能和内存分配

在处理小数据结构且频繁复制或传递时,结构体性能更好,内存使用更高效;对于大数据结构或需要复杂的对象层次和多态行为时,类更合适。因为结构体过大时,值传递开销大,且不支持继承和多态,无法满足复杂需求。

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

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

相关文章

前端力扣刷题 | 6:hot100之 矩阵

73. 矩阵置零 给定一个 m x n 的矩阵,如果一个元素为 0 ,则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 法一: var setZeroes function(matrix) {let setX new Set(); // 用于存储需要置零的行索引let setY new Set(); //…

【编译系列】Torch.compile()训练编译——算子融合逻辑 工程化

1. 背景: torch.compile()中,Dynamo作为前端负责计算图的捕获,后端有inductor、tvm等进行编译优化。 Dynamo:在Python字节码层面注入pass,实现bytecode-to-bytecode的优化,通过对bytecode逐行进行解析构建FX GraphInductor:负责对FX Graph进行AOTAutograd生成joint-gra…

Docker 部署教程jenkins

Docker 部署 jenkins 教程 Jenkins 官方网站 Jenkins 是一个开源的自动化服务器,主要用于持续集成(CI)和持续交付(CD)过程。它帮助开发人员自动化构建、测试和部署应用程序,显著提高软件开发的效率和质量…

2025/2/3 云服务器数据库与idea相连

幸福就摆在你面前,你却把阴影当成山川瀑布,你说你无法幸福。 轻量应用服务器https://swasnext.console.aliyun.com/servers/cn-heyuanhttps://swasnext.console.aliyun.com/servers/cn-heyuanhttps://swasnext.console.aliyun.com/servers/cn-heyuanhttp…

【memgpt】letta 课程1/2:从头实现一个自我编辑、记忆和多步骤推理的代理

llms-as-operating-systems-agent-memory llms-as-operating-systems-agent-memory内存 操作系统的内存管理

6. 【Vue实战--孢子记账--Web 版开发】-- 主币种设置

从这篇文章开始我们将一起实现孢子记账的功能,这篇文章实现主币种设置。这个功能比较简单,因此我们从这个功能开始做。 一、功能 根据项目前期的需求调研,用户需要在设置主币种的时候查看汇率信息(别问为什么有这么个需求&#…

51单片机(STC89C52)开发:点亮一个小灯

软件安装: 安装开发板CH340驱动。 安装KEILC51开发软件:C51V901.exe。 下载软件:PZ-ISP.exe 创建项目: 新建main.c 将main.c加入至项目中: main.c:点亮一个小灯 #include "reg52.h"sbit LED1P2^0; //P2的…

GESP2023年9月认证C++六级( 第三部分编程题(2)小杨的握手问题)

参考程序1&#xff08;暴力枚举&#xff09; #include <iostream> using namespace std;int main() {int n 0;cin >> n; // 读入同学的数量int num[300000]; // 存储同学的学号for (int i 0; i < n; i) {cin >> num[i]; // 读入同学的进入顺序}long…

【C++篇】哈希表

目录 一&#xff0c;哈希概念 1.1&#xff0c;直接定址法 1.2&#xff0c;哈希冲突 1.3&#xff0c;负载因子 二&#xff0c;哈希函数 2.1&#xff0c;除法散列法 /除留余数法 2.2&#xff0c;乘法散列法 2.3&#xff0c;全域散列法 三&#xff0c;处理哈希冲突 3.1&…

GPT与Deepseek等数据驱动AI的缺点

当前数据驱动的AI&#xff08;包括GPT与Deepseek等各种大小模型&#xff09;只进行了数/物理性的初步探索&#xff0c;尚未触及人机环境生态系统的复杂性。也就是说&#xff0c;当前的数据驱动型 AI&#xff0c;虽然在处理大量数据、解决特定任务方面取得了显著进展&#xff0c…

阿里云盘PC端打不开解决办法

阿里云盘服务中心 搜索&#xff1a;PC端无法启动怎么办 选择问题 PC端双击云盘图标没有反应&#xff08;windows系统&#xff09; 下载null.sys&#xff0c;先执行压缩包里面的 null.reg 注册表&#xff0c;再按官方文档操作&#xff0c;不然会报错&#xff0c;搞完建议重启一…

树莓派pico入坑笔记,故障解决:请求 USB 设备描述符失败,故障码(43)

今天心血来潮&#xff0c;拿出吃灰的pico把玩一下&#xff0c;打开thonny&#xff0c;上电&#xff0c;然后...... 上电识别不到端口&#xff0c;windows报错&#xff0c;请求 USB 设备描述符失败&#xff0c;故障码&#xff08;43&#xff09; 一开始以为是坏了&#xff08;磕…

Linux——文件系统

一、从硬件出发 1&#xff09;磁盘的主要构成 通常硬盘是由盘片、主轴、磁头、摇摆臂、马达、永磁铁等部件组成&#xff0c;其中一个硬盘中有多块盘片和多个磁头&#xff0c;堆叠在一起&#xff0c;工作时由盘片旋转和摇摆臂摇摆及逆行寻址从而运作&#xff0c;磁头可以对盘片…

FPGA 时钟多路复用

时钟多路复用 您可以使用并行和级联 BUFGCTRL 的组合构建时钟多路复用器。布局器基于时钟缓存 site 位置可用性查找最佳布局。 如果可能&#xff0c;布局器将 BUFGCTRL 布局在相邻 site 位置中以利用专用级联路径。如无法实现&#xff0c;则布局器将尝试将 BUFGCTRL 从…

C++底层学习预备:模板初阶

文章目录 1.编程范式2.函数模板2.1 函数模板概念2.2 函数模板原理2.3 函数模板实例化2.3.1 隐式实例化2.3.2 显式实例化 2.4 模板参数的匹配原则 3.类模板希望读者们多多三连支持小编会继续更新你们的鼓励就是我前进的动力&#xff01; 进入STL库学习之前我们要先了解有关模板的…

Baklib如何在知识管理领域成为领军者与六款产品的综合评析

内容概要 在知识管理领域&#xff0c;Baklib凭借其卓越的技术和创新的产品线&#xff0c;已经确立了行业的领导地位。作为一个全面的知识管理平台&#xff0c;Baklib为企业提供了高效、便捷的知识存储和管理方案&#xff0c;帮助组织有效整合内外部知识资源。其主要特点包括强…

Baklib阐明企业内容管理与内容中台的本质差异

内容概要 在快速发展的数字时代&#xff0c;企业对信息的管理愈加重视。内容管理在企业日常运营中扮演了重要角色&#xff0c;而随着技术的不断进步&#xff0c;内容中台的概念逐渐走入视野。了解这两者的不同&#xff0c;不仅有助于企业更有效地管理内容&#xff0c;还能提升…

Java 大视界 -- Java 大数据在智能电网中的应用与发展趋势(71)

&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎来到 青云交的博客&#xff01;能与诸位在此相逢&#xff0c;我倍感荣幸。在这飞速更迭的时代&#xff0c;我们都渴望一方心灵净土&#xff0c;而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识&#xff0c;也…

deepseek 本地化部署和小模型微调

安装ollama 因为本人gpu卡的机器系统是centos 7, 直接使用ollama会报 所以ollama使用镜像方式进行部署&#xff0c; 拉取镜像ollama/ollama 启动命令 docker run -d --privileged -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 查看ollama 是否启动…

【腾讯前端面试】纯css画图形

之前参加腾讯面试&#xff0c;第一轮是笔试&#xff0c;面试官发的试卷里有一题手写css画一个扇形、一个平行四边形……笔试时间还是比较充裕的&#xff0c;但是我对这题完全没有思路&#x1f62d;于是就空着了&#xff0c;最后也没过。 今天偶然翻到廖雪峰大佬的博客里提到了关…