C#基础学习(八)终章 C#中的结构体

news/2025/3/31 22:30:46/

        假如你要用数据记录一个人,你觉得要记录些什么,身高,体重,名字等。那两个人呢,他是不是也有这样的特征,那我们是不是就可以用一种数据类型将他们共有的特征提取出来,这就是我们今天讲的结构体

一、初识结构体

结构体 是一种自定义变量类型 类似枚举需要自己定义
它是数据和函数的集合
结构体中 可以声明各种变量和方法
作用:用来表现存在关系的数据集合 比如用结构体表现学生 动物 人类等

二、结构体的申明

//1.结构体一般写在namespace语句块中
//2.结构体关键字 struct//struct 自定义结构体名
//{ 
//    //第一部分
//    //变量//    //第二部分
//    //构造函数(可选)//    //第三部分
//    //函数
//}
//结构体名字 帕斯卡命名法

补充小知识:

①访问修饰符:

        修饰结构体中的变量和方法 是否能被外部使用
        public 公共的 可以被外部使用
        private 私有的 只能在内部使用
        默认为私有
这个访问修饰符并不仅仅只适用于结构体,以后我们会更加频繁的在类中运用 

 ②构造函数:

        和结构体名字同名的函数,无返回值。

作用:为了将你申明的结构体变量进行初始化。默认也可以不写。

三、结构体的实例

//表现学生数据的结构体
struct Student
{//修饰结构体中的变量和方法 是否能被外部使用//public 公共的 可以被外部使用//private 私有的 只能在内部使用//默认为私有//变量//在结构体中申明的变量不能直接初始化//变量类型 可以写任意类型 包括结构体 但是不能是自己的结构体public int age;//年龄public bool sex;//性别public int number;//学号public string name;//姓名//构造函数结构体的构造函数//基本概念//1.没有返回值//2.函数名必须和结构体名相同//3.必须有参数//4.如果申明了构造函数 那么必须在其中对所有变量数据初始化//构造函数 一般是用于在外部方便初始化的public Student(int age,bool sex,int number,string name){ //新的关键字 this//代表自己this.age = age;this.sex = sex;this.number = number;this.name = name;}//函数方法//表现这个数据结构的行为//注意 在结构体中的方法 目前不需要加static关键字public void Speak() {//函数中可以直接使用结构体中申明的变量Console.WriteLine("我的名字是{0},今年{1}",name,age);}}

 四、使用结构体

        static void Main(string[] args){//变量类型 变量名;Student s1;s1.age = 1;s1.sex = false;s1.number = 1;s1.name ="梁启超";s1.Speak();Student s2 = new Student(18,true,2,"小红");s2.Speak();Console.ReadLine();}

补充小知识:

        ①:默认构造函数不可重写

struct Student 
{public string Name;public int Age;public Student(string name, int age) {Name = name;Age = age;}
}// 合法:使用默认构造函数
Student s = new Student(); 

②:只读结构体(C#7.2+)​

readonly修饰结构体,确保所有字段为只读:

readonly struct ImmutablePoint
{public readonly int X;public readonly int Y;public ImmutablePoint(int x, int y) {X = x;Y = y;}
}

结构体的使用注意事项:

  1. 避免大型结构体
    结构体赋值时复制整个值,大型结构体会影响性能。建议结构体大小不超过16字节。

  2. 不要滥用结构体
    适合表示简单的数据结构(如坐标、颜色),复杂逻辑建议使用类。

  3. 慎用可变结构体
    修改结构体会创建副本,可能导致预期外的行为:

    struct MutableStruct { public int Value; }MutableStruct ms = new MutableStruct { Value = 5 };
    ms.Value = 10;  // 实际是修改副本,原结构体未变(若通过属性访问)

    装箱与拆箱:

  4. 结构体转换为object时会装箱(产生堆分配)

int i = 42;
object obj = i;  // 装箱
int j = (int)obj;// 拆箱

        结构体与接口

        接口是什么我们后面学到面向对象的时候再讲,现在先记住就行。

结构体可以实现接口,但转换为接口类型时会装箱:

interface IDisplay
{void Show();
}struct Point : IDisplay
{public int X, Y;public void Show() => Console.WriteLine($"({X}, {Y})");
}// 使用
Point p = new Point { X=3, Y=4 };
p.Show();            // 无装箱
IDisplay disp = p;   // 装箱发生
disp.Show();         

总结:结构体的核心优势

  • 内存高效:栈分配,无GC开销。
  • 数据安全:值类型特性避免意外修改。
  • 性能优化:适合小型、高频使用的数据结构。

关键决策点
✅ 使用结构体:数据小、生命周期短、需要值语义。
✅ 使用类:数据大、需要继承、需要引用语义。


http://www.ppmy.cn/news/1584077.html

相关文章

智能制造:自动化焊装线的数字化设计

通过建设焊装车间生产线智能制造系统,致力于打造一个智能化、绿色环保的工厂,不仅提高生产效率,还将节能减排与环保理念深入到生产流程的每一环节,推动制造业向更高的智能化与绿色化方向迈进。 项目目标 智能制造及绿色工厂的打造…

大数据分析与挖掘实训室总体介绍

一、实训室建设目的与意义 大数据分析与挖掘实训室的建设旨在满足当前社会对大数据专业人才的迫切需求。随着大数据技术在各个行业的广泛应用,如金融、医疗、电商等领域,企业对具备数据采集、预处理、分析与挖掘以及数据可视化能力的专业人才需求激增。…

(C语言)指针运算 习题练习1.2(压轴难题)

在上一张已经练习了三道习题,小试牛刀了,那么在本章在来几题,练练手。(习题三是压轴难题) 习题一 int main() {int aa[2][5] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };int* ptr1 (int*)(&aa 1);int* ptr2 (int*)…

香港电讯企业托管服务,助企业实现高效IT管理与运营

随着企业数字化转型的加速,IT基础设施的复杂性也随之增加。与此同时,流程保障缺失、混合办公和混合云模式、不断增加的IT需求、人力负担和运营成本的增加,企业如何应对这些挑战?为此,香港电讯推出的企业托管服务&#…

横扫SQL面试——事件流处理(峰值统计)问题

横扫SQL面试 📌 事件流处理(峰值统计)问题 “会议室预定冲突怎么查? 🔍 服务器瞬时负载如何算?🎢 健身房的‘人挤人’高峰究竟出现在几点?🏃‍♂️” 这些看似毫不相干…

【持续集成和持续部署】

大致流程: 提交代码--拉取下来新代码并自动构建与部署--应用接口探活--执行自动化测试--输出自动化测试报告 一、持续集成(Continuous Integration,CI) 持续集成是一种软件开发实践,开发团队成员频繁地将代码集成到…

react native 0.72.5集成react-navigation

新项目需要集成react navigation直接集成了react navigation最新版本7.x安卓运行项目的时候遇到报错generateCodegenArtifactsFromSchema Failed排查问题原因:发现node_modules/react-native/codegen/package.json里面的version是0.77.0(当前时刻最新的R…

【Uni-App】嵌入悬浮球全局组件的详细教程和防踩坑点

一、前言 近期接到一个业务需求是为为h5页面嵌入悬浮球,而且还得是全局化(这样所有页面就可以看见了),在开发的过程中也遇到一些坑,在此和大家一起学习、讨论。 二、准备工作 下载悬浮球组件代码 悬浮球 - DCloud …