博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#图解教程 第十章 结构
阅读量:4619 次
发布时间:2019-06-09

本文共 3080 字,大约阅读时间需要 10 分钟。

结构

什么是结构


结构是程序员定义的数据类型,与类非常相似。它们有数据成员和函数成员。结构与类的重要区别是:

  • 类是引用类型而结构是值类型
  • 结构是隐式密封的,这意味着它们不能被派生

声明结构的语法与声明类相似

关键字  ↓struct SturctName{    MemberDeclarations}

例:Point结构

struct Point{    public int X;    public int Y;}class Program{    static void Main()    {        Point first,second,third;        first.X=10;first.Y=10;        second.X=20;second.Y=20;        third.X=first.X+second.X;        third.Y=first.Y+second.Y;        Console.WriteLine("first:  {0},{1}",first.X,first.Y);        Console.WriteLine("second:  {0},{1}",second.X,second.Y);        Console.WriteLine("third:  {0},{1}",third.X,third.Y);    }}

结构是值类型


和所有值类型一样,结构类型变量含有自己的数据。因此:

  • 结构类型变量不能为null
  • 两个结构变量不能引用同一对象

例:结构变量的内存安排

class CSimple{    public int X;    public int Y;}struct Simple{    public int X;    public int Y;}class Program{    static void Main()    {        var cs=new CSimple();        var ss=new Simple();        ...    }}

对结构赋值


把一个结构赋值给另一个结构,就将一个结构的值复制给另一个结构。这和复制类变量不同,复制类变量时只复制引用。

例:结构变量赋值与类变量赋值的区别

class CSimple{    public int X;    public int Y;}struct Simple{    public int X;    public int Y;}class Program{    static void Main()    {        CSimple cs1=new CSimple(),cs2=null;        Simple ss1=new Simple(),ss2=new Simple();        cs1.X=ss1.X=5;        cs1.Y=ss1.Y=10;        cs2=cs1;        ss2=ss1;    }}

构造函数和析构函数


结构可以有实例构造函数和静态构造函数,但不允许有析构函数。

实例构造函数

语言隐式地为每个结构提供一个无参构造函数。这个构造函数把结构的每个成员设置为该类型的默认值。值成员设置成它们的默认值,引用成员设置为null。

例:带参数的构造函数

struct Simple{    public int X;    public int Y;    public Simple(int a,int b)    {        X=a;        Y=b;    }}class Program{    static void Main()    {        var s1=new Simple();        var s2=new Simple(4,10);        Console.WriteLine("{0},{1}",s1.X,s1.Y);        Console.WriteLine("{0},{1}",s2.X,s2.Y);    }}

也可以不是用new运算符创建结构实例,然而这样做,有一些限制:

  • 在显式设置数据成员后,才能使用它们的值
  • 在对所有数据成员赋值后,才能调用任何函数成员

例:不用new创建结构实例

struct Simple{    public int X;    public int Y;}class Program{    static void Main()    {        Simple s1,s2;        Console.WriteLine("{0},{1}",s1.X,s1.Y);  //编译错误                                     ↑     ↑                                      还未赋值        s2.X=5;        s2.Y=10;        Console.WriteLine("{0},{1}",s2.X,s2.Y);  //没错误    }}
静态构造函数

与类相似,结构的静态构造函数创建并初始化静态数据成员,而且不能引用实例成员。

以下两种行为发生前,会调用静态构造函数

  • 调用显式声明的构造函数
  • 引用结构的静态成员
构造函数和析构函数小结

字段初始化语句是不允许的


在结构中字段初始化语句是不允许的。

struct Simple{    public int x=10;  //编译错误    public int y=10;  //编译错误}

结构是密封的


结构总是隐式密封的,因此,不能从它们派生其他结构。

结构不支持继承,所以下列修饰符不能用于结构声明:

  • protected
  • internal
  • abstract
  • virtual

结构都派生自System.ValueType,System.ValueType派生自object。

两个可以用于结构成员并与继承相关的关键字是new和override,当创建一个和基类System.ValueType的成员有相同名称的成员时使用它们。

装箱和拆箱


如同其他值类型数据,如果想将一个结构实例作为引用类型对象,必须创建装箱(boxing)副本。装箱的过程就是制作值类型变量的引用类型副本。装箱和拆箱(unboxing)在第16章详述。

结构作为返回值和参数


结构可以作为返回值和参数

  • 返回值 当结构作为返回值时,将创建它的副本并从函数成员返回
  • 值参数 当结构作为值参数时,将创建实参结构的副本。该副本用于方法的执行中
  • ref和out参数 若把一个结构用作ref或out参数,传入方法的是结构的引用,这样就可以修改其数据成员

关于结构的其他信息


对于结构进行分配比创建类的实例开销小,所以使用结构替代类有时可以提高性能,但要注意到装箱和拆箱的高代价。

关于结构,需要知道的最后一些事情如下:

  • 预定义简单类型(int、short、long等等),尽管在.NET和C#中被视为原始类型,它们实际上在.NET中都实现为结构
  • 可以使用与声明分部类相同的方法声明分部结构,如所述。

结构和类一样,可以实现接口。接口将在第15章阐述。

转载于:https://www.cnblogs.com/moonache/p/6197243.html

你可能感兴趣的文章
C#根据html生成PDF
查看>>
Neutron SDN 手动实现手册
查看>>
linux下core文件调试方法
查看>>
20个创意404错误页面设计的启示
查看>>
DBCP连接池配置参数说明
查看>>
C语言实现四舍五入
查看>>
SSH创建公钥实现无密码操作失败原因
查看>>
【转】Javascript模块化编程(三):require.js的用法
查看>>
需求规格说明书
查看>>
python mysql 查询返回字典结构
查看>>
mysql 统计sql
查看>>
Java中的抽象类
查看>>
关于Altium Designer的BOM,元件清单
查看>>
使用MongoDB ruby驱动进行简单连接/CRUD/运行命令
查看>>
关于set和multiset的一些用法
查看>>
基础训练 芯片测试
查看>>
如何用命令将本地项目上传到git
查看>>
JavaScript 实现鼠标拖动元素
查看>>
js 模糊查询 (360接口)
查看>>
python+rabbitMQ实现生产者和消费者模式
查看>>