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.mzph.cn/web/67887.shtml

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

相关文章

追逐低空经济,无人机研学技术详解

追逐低空经济,无人机研学技术成为了一个备受关注的领域。以下是对无人机研学技术的详细解析: 一、无人机研学技术概述 无人机研学技术是以无人机为核心,结合航空科技、电子技术、机械原理等多领域知识的一种教育实践活动。它旨在通过理论学习…

(done) MIT6.S081 2023 学习笔记 (Day7: LAB6 Multithreading)

网页:https://pdos.csail.mit.edu/6.S081/2023/labs/thread.html (任务1教会了你如何用 C 语言调用汇编,编译后链接即可) 任务1:Uthread: switching between threads (完成) 在这个练习中,你将设计一个用户级线程系统中的上下文切…

Kubernetes学习之通过Service访问Pod

一、基础概述 1.当通过deployment等controller动态创建和销毁pod使得每个pod都有自己的ip地址,当controller用新的pod替代发生故障的pod时,新的pod会分配到新的ip地址,那么客户端如何稳定的找到并访问pod提供的服务。 2.创建service service从…

【优先算法】专题——前缀和

目录 一、【模版】前缀和 参考代码: 二、【模版】 二维前缀和 参考代码: 三、寻找数组的中心下标 参考代码: 四、除自身以外数组的乘积 参考代码: 五、和为K的子数组 参考代码: 六、和可被K整除的子数组 参…

CDDIS从2025年2月开始数据迁移

CDDIS 将从 2025 年 2 月开始将我们的网站从 cddis.nasa.gov 迁移到 earthdata.nasa.gov,并于 2025 年 6 月结束。 期间可能对GAMIT联网数据下载造成影响。

谷歌Titans模型论文解析,Transformer迎来变革拐点——DeepSeek能否“接招”?

一、引入 Titans 模型 我们将深入探讨谷歌研究院的一篇新论文《Titans: Learning to Memorize at Test Time》,该论文介绍了一种名为 Titans 的新模型架构。 Titans 在缓解 Transformer 二次方成本问题的同时,展现出了令人期待的成果。Titans 模型的设…

新春贺岁,共赴AGI之旅

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 往期精彩文章推荐 季姮教授独家文字版干货 | 面向知识渊博的大语言模型 关于AI TIME AI TIME源起于2019年,旨在发扬科学思辨精神,邀请各界人士对人工智能理论、算法和场景应用的本质问题…

Baklib推动数字化内容管理解决方案助力企业数字化转型

内容概要 在当今信息爆炸的时代,数字化内容管理成为企业提升效率和竞争力的关键。企业在面对大量数据时,如何高效地存储、分类与检索信息,直接关系到其经营的成败。数字化内容管理不仅限于简单的文档存储,更是整合了文档、图像、…

【memgpt】letta 课程4:基于latta框架构建MemGpt代理并与之交互

Lab 3: Building Agents with memory 基于latta框架构建MemGpt代理并与之交互理解代理状态,例如作为系统提示符、工具和agent的内存查看和编辑代理存档内存MemGPT 代理是有状态的 agents的设计思路 每个步骤都要定义代理行为 Letta agents persist information over time and…

FPGA|例化生成的PLL功能IP核

1、例化上一篇文章中调用的IP核,新建文件PLL_test.v 2、代码如图 timescale 1ns / 1ps module PLL_test(input clk,input rst_n,output clkout0,output clkout1,output clkout2,output clkout3,output clkout4);wire locked;PLL pll_inst(.inclk0(clk),.c0(clkout0)…

【C++】P5734 【深基6.例6】文字处理软件

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 💯前言💯题目描述💯题目描述输入格式输出格式示例输入与输出输入:输出: 💯我的做法操作1:在文档末尾插入字符串操作2&…

后盾人JS -- 原型

没有原型的对象 也有没有原型的对象 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document<…

洛谷 P1130 红牌 C语言

题目描述 某地临时居民想获得长期居住权就必须申请拿到红牌。获得红牌的过程是相当复杂&#xff0c;一共包括 N 个步骤。每一步骤都由政府的某个工作人员负责检查你所提交的材料是否符合条件。为了加快进程&#xff0c;每一步政府都派了 M 个工作人员来检查材料。不幸的是&…

【线程】基于环形队列的生产者消费者模型

1 环形队列 环形队列采用数组来模拟&#xff0c;用取模运算来模拟环状特性。 1.如何判断环形队列为空或者为满? 当环形队列为空时&#xff0c;头和尾都指向同一个位置。当环形队列为满时&#xff0c;头和尾也都指向同一个位置。 因此&#xff0c; 可以通过加计数器或者标记…

商品列表及商品详情展示

前言 本文将展示一段结合 HTML、CSS 和 JavaScript 的代码&#xff0c;实现了一个简单的商品展示页面及商品详情&#xff0c;涵盖数据获取、渲染、搜索及排序等功能。 效果展示 点击不同的商品会展示对应的商品详情。 代码部分 代码总体实现 <!DOCTYPE html> <htm…

大模型综述一镜到底(全文八万字) ——《Large Language Models: A Survey》

论文链接&#xff1a;https://arxiv.org/abs/2402.06196 摘要&#xff1a;自2022年11月ChatGPT发布以来&#xff0c;大语言模型&#xff08;LLMs&#xff09;因其在广泛的自然语言任务上的强大性能而备受关注。正如缩放定律所预测的那样&#xff0c;大语言模型通过在大量文本数…

【C++】B2124 判断字符串是否为回文

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: C 文章目录 &#x1f4af;前言&#x1f4af;题目描述输入格式&#xff1a;输出格式&#xff1a;样例&#xff1a; &#x1f4af;方法一&#xff1a;我的第一种做法思路代码实现解析 &#x1f4af;方法二&#xff1a;我…

ubuntuCUDA安装

系列文章目录 移动硬盘制作Ubuntu系统盘 前言 根据前篇“移动硬盘制作Ubuntu系统盘”安装系统后&#xff0c;还不能够使用显卡。 如果需要使用显卡&#xff0c;还需要进行相关驱动的安装&#xff08;如使用的为Nvidia显卡&#xff0c;就需要安装相关的Nvidia显卡驱动&#xff…

Sqoop导入MySQL中含有回车换行符的数据

个人博客地址&#xff1a;Sqoop导入MySQL中含有回车换行符的数据 MySQL中的数据如下图&#xff1a; 检查HDFS上的目标文件内容可以看出&#xff0c;回车换行符位置的数据被截断了&#xff0c;导致数据列错位。 Sqoop提供了配置参数&#xff0c;在导入时丢弃掉数据的分隔符&…

掌握API和控制点(从Java到JNI接口)_36 JNI开发与NDK 04

4、 *.so的入口函数&#xff1a;JNI_OnLoad() VM (virtual machine)的角色 Java代码在VM上执行。在执行Java代码的过程中&#xff0c;如果Java需要与本地代码(*.so)沟通时&#xff0c; VM就会把*.so視为插件<Tn>而加载到VM里。然后让Java函数呼叫到这插件<Tn>里的…