C#数据类型之结构体介绍

简介: C#数据类型之结构体介绍

一、结构体定义

      在 C# 中,结构体是值类型数据结构。它使得一个单一变量可以存储各种数据类型的相关数据。struct 关键字用于创建结构体,是用来代表一个记录。结构体主要是记录存储数据属性,例如学生档案信息、图书资料编码、人物资料、三维点的信息等等,包含实例的属性。

public struct student
    { 
        //字段、属性、方法、事件
    }

二、成员类型

定义一个学生档案的结构体,里面包含学生姓名、年龄、体重等信息,结构体定义如下:

public struct student
    {
        public int age;
        public string name;
        private double weight;      
        public double WG
        {
            set
            {
                weight = value;
            }
            get
            {
                return weight;
            }
        }
        public void show()//显示学生的个人能力、学习能力等展示信息
        { 
                
        }
    }

1、字段和属性

注意:

1.在结构体中字段只能够通过构造函数来实现初始化(除非字段被const 或者是 static 修饰),不像在类中我们可以在创建字段的时候直接对齐初始化。未被赋值的字段和属性如果是int类型默认值为0,字符串的默认值为空。

在结构体中字段和属性是不能进行初始化赋值的,只有通过const设置为常量,或者static设置为静态变量即可作为结构体通用数据赋予初始值。其中static可以在主函数内修改该数据,而const定义的变量无法被修改。

值类型的默认值如下图:

定义结构体:

public static string school = "清华";
        public const int school_level = 1;
        public int age;
        public string name;
        private double weight;   //属性的私有类型可以保护数据
        public double WG //为属性
        {
            set
            {
                weight = value;
            }
            get
            {
                return weight;
            }
        }

主函数:

student stu1 = new student();
            Console.WriteLine("统计学校: "+student.school);
            Console.WriteLine("学校的等级: "+student.school_level);
            Console.WriteLine("学生的年龄:"+stu1.age);
            Console.WriteLine("学生的姓名:" + stu1.name);
            Console.WriteLine("学生的体重:"+stu1.WG);
            Console.ReadKey();

输出结果:

2.初始化只能通过两种形式第一种是通过带参的构造函数,第二种是通过实例化后赋值;

构造函数内一定要对字段和属性进行初始化 ,如果定义了事件,对事件也要进行初始化。

 第一种方法:构造函数初始化,结构体中构造函数如下

public student(int age,string name,double weight)
{
    this.age = age;
    this.name = name;
    this.weight = weight;
  
}

主函数

student stu1 = new student(15,"xiaoming",47.8);
            student.school = "北大";
            Console.WriteLine("统计学校: "+student.school);
            Console.WriteLine("学校的等级: "+student.school_level);
            Console.WriteLine("学生的年龄:"+stu1.age);
            Console.WriteLine("学生的姓名:" + stu1.name);
            Console.WriteLine("学生的体重:"+stu1.WG);

输出结果为:

第二种方法:在主函数中直接对结构体数值进行初始化;

student stu2 = new student();
            stu2.age = 16;
            stu2.name = "xiaogang";
            stu2.WG = 53.14;
            Console.WriteLine("学生的年龄:" + stu2.age);
            Console.WriteLine("学生的姓名:" + stu2.name);
            Console.WriteLine("学生的体重:" + stu2.WG);

输出结果为:

2.方法

结构体是值类型数据,当一个结构体变量作为函数参数传递时, 属于值类型的值传递,也就是传入的是一个副本,函数体内对结构体的改变,不会影响方法体外的结构体变量。如果想要改变,可以使用ref 或者out 进行值类型的引用传递,这样,传入的参数就是结构体本身,当方法体内改变了结构体变量也就是改变了方法体外的结构体变量。

 

结构体内定义方法:

public void Addweight(ref student student)
        {
            student.weight += weight_inhense;
            this.weight = 38.5;
        }

输出结果为:

3.事件

结构体内可以定义委托,事件为委托的实例化方法的载体。

定义委托和事件
        public delegate void publisher(student student);
        public event publisher Receive;

如果结构体内有构造函数。需要对事件也进行初始化。

调用事件
        public void show()//显示学生的个人能力、学习能力等展示信息
        {
            Receive(this);
        }

主函数内塞入事件的方法:

public static class Stu_asker
    {
        public static void Study(student student)
        {
            Console.WriteLine("此学生的学习能力为: "+ student.school_level*10);
        }
        public static void happy(student student)
        {
            Console.WriteLine("此学生的开心指数为: " + (student.school_level+10));
        }
    }

 

stu1.Receive += Stu_asker.Study;
            stu1.Receive += Stu_asker.happy;
            stu1.show();

三、类和结构体的区别

  1、结构是值类型,它在栈中分配空间;而类是引用类型,它在堆中分配空间,栈中保存的只是引用。

  2、结构类型直接存储成员数据,让其他类的数据位于对中,位于栈中的变量保存的是指向堆中数据对象的引用。

  3、结构类型可以有实例构造函数和静态构造函数,但不能有析构函数。

主要参考以下文章:

c# --- 结构体(struct)_c# 结构体_yang28242687的博客-CSDN博客

四、整体程序

using System;
namespace test
{
    public class qiao
    {
        public delegate void abb(int test);
        static void Main(string[] args)
        {
            
            student stu1 = new student(15,"xiaoming",47.8);
            student.school = "北大";
            student stu2 = new student();
            stu2.age = 16;
            stu2.name = "xiaogang";
            stu2.WG = 53.14;
            stu1.Addweight(ref stu2);
            Console.WriteLine("学生的年龄:" + stu2.age);
            Console.WriteLine("学生的姓名:" + stu2.name);
            Console.WriteLine("学生的体重:" + stu2.WG);
            Console.WriteLine("统计学校: " + student.school);
            Console.WriteLine("学校的等级: " + student.school_level);
            Console.WriteLine("学生的年龄:" + stu1.age);
            Console.WriteLine("学生的姓名:" + stu1.name);
            Console.WriteLine("学生的体重:" + stu1.WG);
            stu1.Receive += Stu_asker.Study;
            stu1.Receive += Stu_asker.happy;
            stu1.show();
            Console.ReadKey();
        }
    }
    public struct student
    {
        public delegate void publisher(student student);
        public event publisher Receive;
        public static string school = "清华";
        public const int weight_inhense = 10;
        public const int school_level = 1;
        public int age;
        public string name;
        private double weight;      
        public double WG
        {
            set
            {
                weight = value;
            }
            get
            {
                return weight;
            }
        }
        public student(int age,string name,double weight)
        {
            this.age = age;
            this.name = name;
            this.weight = weight;
            this.Receive = null; //对事件也要进行初始化;
  
        }
        public void Addweight(ref student student)
        {
            student.weight += weight_inhense;
            this.weight = 38.5;
        }
        public void show()//显示学生的个人能力、学习能力等展示信息
        {
            Receive(this);
        }
    }
    public static class Stu_asker
    {
        public static void Study(student student)
        {
            Console.WriteLine("此学生的学习能力为: "+ student.school_level*10);
        }
        public static void happy(student student)
        {
            Console.WriteLine("此学生的开心指数为: " + (student.school_level+10));
        }
    }
}

输出结果为:

 

相关文章
|
6月前
|
C#
C#学习相关系列之数据类型类的三大特性(二)
C#学习相关系列之数据类型类的三大特性(二)
|
6月前
|
C#
C#数据类型之枚举类型
C#数据类型之枚举类型
138 0
|
6月前
|
存储 编译器 数据处理
C#基础入门之数据类型
C#基础入门之数据类型
|
6月前
|
数据处理 C# C++
如何使用C#和C++结构体实现Socket通信
如何使用C#和C++结构体实现Socket通信
282 0
|
6月前
|
存储 C# 图形学
【Unity 3D】C#数据类型和变量、命名规范的讲解(附源码)
【Unity 3D】C#数据类型和变量、命名规范的讲解(附源码)
152 1
|
2月前
|
存储 C# 索引
C# 一分钟浅谈:变量与数据类型简介
【9月更文挑战第1天】在 C# 编程中,了解变量与数据类型至关重要。本文详细介绍了 C# 中的值类型(如整数、浮点数、布尔值等)和引用类型(如类、接口、数组、字符串)。通过示例代码展示了变量的声明与使用方法,并针对数据类型转换错误、变量未初始化及数值溢出等常见问题提供了解决方案。正确选择数据类型不仅能提升程序性能,还可避免潜在错误,有助于编写高质量代码。
129 47
|
3月前
|
存储 C#
揭秘C#.Net编程秘宝:结构体类型Struct,让你的数据结构秒变高效战斗机,编程界的新星就是你!
【8月更文挑战第4天】在C#编程中,结构体(`struct`)是一种整合多种数据类型的复合数据类型。与类不同,结构体是值类型,意味着数据被直接复制而非引用。这使其适合表示小型、固定的数据结构如点坐标。结构体默认私有成员且不可变,除非明确指定。通过`struct`关键字定义,可以包含字段、构造函数及方法。例如,定义一个表示二维点的结构体,并实现计算距离原点的方法。使用时如同普通类型,可通过实例化并调用其成员。设计时推荐保持结构体不可变以避免副作用,并注意装箱拆箱可能导致的性能影响。掌握结构体有助于构建高效的应用程序。
111 7
|
3月前
|
Java C#
C# 和 java 基本数据类型
C# 和 java 基本数据类型
22 0
|
5月前
|
存储 C# 开发者
C# 编程基础:注释、变量、常量、数据类型和自定义类型
C# 编程基础:注释、变量、常量、数据类型和自定义类型
|
6月前
|
存储 C#
C#.Net筑基-类型系统②常见类型--结构体类型Struct
本文介绍了C#中的结构体(struct)是一种用户自定义的值类型,适用于定义简单数据结构。结构体可以有构造函数,能定义字段、属性和方法,但不能有终结器或继承其他类。它们在栈上分配,参数传递为值传递,但在类成员或包含引用类型字段时例外。文章还提到了`readonly struct`和`ref struct`,前者要求所有字段为只读,后者强制结构体存储在栈上,适用于高性能场景,如Span和ReadOnlySpan。