C#入门系列 -- 结构体应用

举报
陈言必行 发表于 2022/03/13 10:25:49 2022/03/13
【摘要】 初始化C#中结构体类型变量称为对象或称为结构实例。定义结构体类型变量称为把结构体类型实例化,这时会根据结构体类型的定义为结构体变量分配相应的存储空间。变量名列表中各变量名用逗号隔开,变量名的命名方法遵守C#的标识符命名规则。例如:结构体类型 变量名1,2,3;sut s1, s2, s3;结构体变量被声明后,系统会为其分配存储空间。每个结构体变量都有自己独立的存储空间,每个变量都有自己的数...

初始化

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

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

结构体类型 变量名123;

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;
    }
}

需要知道的点:

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

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

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。