写点什么

C#入门系列 (十四) -- 结构体应用

作者:陈言必行
  • 2022 年 6 月 14 日
  • 本文字数:1358 字

    阅读完需:约 4 分钟

初始化

C#中结构体类型变量称为对象或称为结构实例。定义结构体类型变量称为把结构体类型实例化,这时会根据结构体类型的定义为结构体变量分配相应的存储空间。


变量名列表中各变量名用逗号隔开,变量名的命名方法遵守 C#的标识符命名规则。例如:


结构体类型 变量名1,2,3;
sut s1, s2, s3;
复制代码


结构体变量被声明后,系统会为其分配存储空间。


每个结构体变量都有自己独立的存储空间,每个变量都有自己的数据副本,对一个变量的操作不会影响另一个变量。



构造函数

每个结构体类型定义后,语言都隐式地为它提供一个无参数的构造函数,这个构造函数把结构的每个成员都设置为该成员类型的默认值。


如果希望在结构体变量定义时,能够对这些变量进行初始化则需要用户自己创建有参数的构造函数。


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


实例构造函数


结构类型都有一个预定义的,没有参数的构造函数。此构造函数不允许删除和重定义,并且这个无参数的构造函数会一直存在,并不会因为定义了其他带参数的构造函数就消失。


下面是实例构造函数的一般定义形式:


public 结构体类型名(参数列表){    函数体;}
复制代码


定义实例构造函数时需注意:


结构体不支持显式定义无参数的实例构造函数。当定义带参数的构造函数时,一定要完成结构所有字段的初始化,如果没有完成所有字段的初始化,编译时会发生错误。



  • 代码示例:


class Program{    static void Main(string[] args)    {        // 声明结构体类型变量p1,并进行初始化        Point p1 = new Point(1, 2);        // 只声明变量不初始化        Point p2;

Console.ReadLine(); }}
struct Point{ public int X; public int Y;
public Point(int x, int y) { X = x; Y = y; }}
复制代码

静态构造

静态构造函数


结构类型也可以有静态构造函数,静态构造函数用于初始化静态数据成员。


静态构造函数有如下特点:


  • 静态构造函数不能有访问修饰符和参数;

  • 静态构造函数不能访问实例成员;

  • 静态构造函数无法直接进行调用;


结构和类的静态构造函数的触发规则不同,类的静态构造函数是在创建第一个实例或引用任何静态成员之前自动调用的,而结构的静态构造函数在以下情况调用:


  • 使用显式声明的构造函数进行初始化;

  • 调用结构的方法或访问结构的静态数据成员(无论是读取还是赋值,访问实例数据成员不会触发 CLR 自动调用静态的构造函数)。

成员使用

使用结构体变量主要是引用它的成员。


语法形式如下:


结构体变量名.成员名
复制代码


使用成员引用运算符时需注意:


  1. 成员引用运算符左边必须是结构体类型变量名,右边必须是结构体中的成员名;

  2. 如果结构体中的成员本身又是一个结构体对象,则要使用成员运算符,一级一级的引用。

  3. 输出结构体类型变量的内容时,不能整体输入和输出,只能对其基本类型的成员逐个输入或输出。建议重新 ToString 方法,自定义输出内容。比如:


struct Point{    public int X;    public int Y;
public override string ToString() { string resStr = "Point X坐标为: " + X + " , Y坐标为: " + Y; return resStr; }}
复制代码


需要知道的点:


  • 结构体对象赋值时,本质上是把一个对象内存空间中的全体成员赋值到另一个对象存储空间中。

  • 如果结构体类型中包括大量的数据成员时,结构体对象的赋值会耗费大量时间。

发布于: 刚刚阅读数: 3
用户头像

陈言必行

关注

公号:开发同学留步 2019.03.12 加入

我是一个从事Unity游戏开发攻城狮,6年开发经验,助你日常不加班。

评论

发布
暂无评论
C#入门系列(十四) -- 结构体应用_C#_陈言必行_InfoQ写作社区