博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C# 中的结构类型(struct)
阅读量:6525 次
发布时间:2019-06-24

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

原文

 

简介

  有时候,类中只包含极少的数据,因为管理堆而造成的开销显得极不合算。这种情况下,更好的做法是使用结构(struct)类型。由于 struct 是值类型,是在栈(stack)上存储的,所以能有效的减少内存管理的开销(当然前提是这个结构足够小)。

        结构可以包含它自己的字段、方法和构造器。
        int 实际上是 Sysytem.Int32 结构类型。

默认构造器(构造函数)

        编译器始终会生成一个默认的构造器,若自己写默认构造器则会出错(默认构造器始终存在)。自己只能写非默认构造器,并且在自己写的构造器中初始化所有字段。

 

struct Time      {          public Time()          {              // 编译时错误:Structs cannot contain explicit parameterless constructors          }      }            struct NewYorkTime      {          private int hours, minutes, seconds;                public NewYorkTime(int hh, int mm)          {              hours = hh;              minutes = mm;          }   // 编译时错误,因为 seconds 未初始化      }

        可以使用 ? 修饰符创建一个结构变量的可空(nullable)的版本。然后把 null 值赋给这个变量。

using System;      using System.Collections.Generic;      using System.Linq;      using System.Text;            namespace structType      {          class Program          {              static void Main(string[] args)              {                  NewYorkTime? currentTime = null;    // 结构类型也是值类型,可以声明为可空              }          }                struct NewYorkTime          {              private int hours, minutes, seconds;                    public NewYorkTime(int hh, int mm)              {                  hours = hh;                  minutes = mm;                  seconds = 0;              }          }      }

默认构造器不需要也不能自己定义,默认构造器会把所有的自动初始化为 0 。

 

using System;      using System.Collections.Generic;      using System.Linq;      using System.Text;            namespace structType      {          class Program          {              static void Main(string[] args)              {                  Time now = new Time();  // 调用默认构造器,从而自动初始化,所有字段为 0              }          }                struct Time          {              private int hours, minutes, seconds;          }      }

 

        字段(field)值如下:

下面这种方式,结构将不会被初始化,但是也不能访问。

 

using System;      using System.Collections.Generic;      using System.Linq;      using System.Text;            namespace structType      {          class Program          {              static void Main(string[] args)              {                  Time now;  // 不进行初始化,若访问字段的值会造成编译错误              }          }                struct Time          {              private int hours, minutes, seconds;          }      }

 

  字段(field)值如下

 

自定义构造器

自己定义的构造器必须在构造器内把所有的字段初始化。

 

using System;      using System.Collections.Generic;      using System.Linq;      using System.Text;            namespace structType      {          class Program          {              static void Main(string[] args)              {                  Time now = new Time(12, 30);              }          }                struct Time          {              private int hours, minutes, seconds;                    public Time(int hh, int mm)              {                  hours = hh;                  minutes = mm;                  seconds = 0;              }          }            }

 

字段(field)值如下

        结构中的字段不能在声明的同时进行初始化。

 

struct Time      {          private int hours = 0;  // 报错 'Time.hours': cannot have                                   // instance field initializers in structs                private int minutes, seconds;                public Time(int hh, int mm)          {              hours = hh;              minutes = mm;              seconds = 0;          }      }

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

转载地址:http://xknbo.baihongyu.com/

你可能感兴趣的文章
纵观视频监控市场这几个方面值得关注
查看>>
北大访问教授吴霁虹:如何把握AI产业化机遇并建立竞争优势 | CITE 2017
查看>>
LINUX 常用命令整理
查看>>
【云周刊】第134期:阿里云发布ECS企业级产品家族 19款实例族涵盖173个应用场景...
查看>>
iOS 位枚举
查看>>
关注ERP之根,基础数据的准备
查看>>
中兴计划2017年泰国收入实现50%的增长
查看>>
德国禁止Facebook利用WhatsApp用户信息:没法律基础
查看>>
全球太阳能产业掣肘在哪儿?
查看>>
“灾备全生态”全揭秘
查看>>
CSS盒子模型
查看>>
Zeppelin Prefix not found.
查看>>
ubuntu中eclipse安装svn插件问题
查看>>
linux 的网络设置
查看>>
首届“欧亚杯”象翻棋全国团体邀请赛圆满收评!
查看>>
编译tomcat
查看>>
最简单 iText 的 PDF 生成方案(含中文解决方案)HTML 转为 PDF
查看>>
MySql中is NULL、ISNULL()和IFNULL()运行速度的比较
查看>>
关于unichar字符串的初始化
查看>>
oracle-xe手工创建数据库
查看>>