• C# 中的结构类型(struct)


    原文 C# 中的结构类型(struct)

    简介

      有时候,类中只包含极少的数据,因为管理堆而造成的开销显得极不合算。这种情况下,更好的做法是使用结构(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;  
            }  
        }  

     

     

     

     

     

     

     

     

  • 相关阅读:
    九项重要的职业规划提示
    Java程序员应该掌握的十项技术
    把QQ炫铃变为本机系统提示音
    maven 安装jar到库中
    Java程序连接各种数据库的方法
    J2EE体系架构概述
    一个完整的项目管理流程(适合软件开发)
    JavaScript函数调用时的作用域链和调用对象是如何形成的及与闭包的关系
    iframe自适应及offsetHeight/Width+scrollHeight/Width区别
    JavaBean的绑定属性及约束属性[转]
  • 原文地址:https://www.cnblogs.com/arxive/p/5947914.html
Copyright © 2020-2023  润新知