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


    ylbtech- .NET-Basic:C# 中的结构类型(struct type)

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

    1.A,相关概念返回顶部
     
      像类一样,结构(struct)是能够包含数据成员和函数成员的数据结构,但是与类不同,结构是值类型,不需要堆分配。结构类型不支持用户指定的继承,并且所有的结构类型都隐式地从类型 object 继承。
      结构是使用 struct 关键字定义的,通常用来封装小类型相关变量组,例如,矩形的坐标或商品的特征。下面的示例显示了一个简单的结构类型。
    public struct Book
    {
        public decimal price;
        public string title;
        public string author;
    }

      结构对于具有值语义的小型的数据结构特别有用。复数、坐标系中的点或字典中的“键-值”对都是结构类型的典型示例。对小型数据结构而言,使用结构而不是用类会大大节省应用程序分配的量。例如,下面的程序创建并初始化一个含有 100 个点的数组。对于作为类实现的 Piont,出现了 101 个实例对象,其中,数组需要一个,它的 100 个元素每一个都需要一个,具体情况看下例:

            //使用类进行“键-值”对的应用
    using System;
    namespace Test
    {
        class Piont
        {
            public int x, y;
            public Piont(int x, int y)
            {
                this.x = x;
                this.y = y;
            }
        }
        class PiontClass
        {
            static void Main()
            {
                Piont[] pionts = new Piont[100];
                for (int i = 0; i < 100; i++)
                    pionts[i] = new Piont(i, i);
    
            }
        }
    }

      一种替代办法是将 Piont 定义为结构。

    struct Piont
    {
        public int x, y;
        public Piont(int x, int y)
        {
            this.x = x;
            this.y = y;
        }
    }

      替换后,示例如下:

            //使用 struct 后的示例
    using System;
    namespace Test
    {
        struct Piont
        {
            public int x, y;
            public Piont(int x, int y)
            {
                this.x = x;
                this.y = y;
            }
        }
        class PiontClass
        {
            static void Main()
            {
                Piont[] pionts = new Piont[100];
                for (int i = 0; i < 100; i++)
                    pionts[i] = new Piont(i, i);
    
            }
        }
    }

      现在,只有一个对象被实例化(即用于数组的那个对象),而 Piont 实例以值的形式直接内联存储在数组中。

      结构构造函数也是使用 new 运算调用,但是这并不意味着会分配内存。与动态分配对象并返回对它的引用不同,结构构造函数直接返回构造值本身(通常是堆栈上的一个临时位置),然后根据需要复制该结构值。

      对于类,两个变量可能引用同一对象,因此对一个变量进行操作可能影响另一个变量所引用的对象。对于结构,每个变量都有自己的数据副本,对一个变量操作不可能影响另一个变量。下面的代码段产生的输出取决于 Piont 是类还是构造。

      Piont a = new Piont(10,10);

      Piont b= a;

      a.x = 20;

      Console.WriteLine(b.x);

      如果 Piont 是类,将输出是 20,因为 a 和 b 引用同一对象。如果 Piont 是结构,输出将是 10,因为将 a 对 b 的赋值创建了该值的一个副本,因此接下来对 a.x 的赋值不会影响 b 这一副本。

      前一示例突出了结构的两个限制。首先,赋值整个结构常数不如复制对象引用的效率高,因此结构类型的赋值和值参数传递可能比引用类型的开销更大。其次,除了 ref 和 out 参数,不可能创建对结构的引用,这样限制了结构的应用范围。

      结构还可以包含构造函数、常量、字段、方法、属性、索引器、运算符、事件和嵌套类型,但如果同时需要上述几种成员,则应当考虑改为使用类作为类型。

      结构可是实现接口,但它们无法继承另一个结构。因此,结构成员无法声明为 protected。

    warn 作者:ylbtech
    出处:http://ylbtech.cnblogs.com/
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    java IO输入输出流实现文本复制
    java HashMap
    java TreeSet 实现存自定义不可重复数据
    java中的ArrayList 使得集合中的对象不重复
    java 多线程执行过程
    final关键字的使用
    java中==和equals的区别
    java面向对象理解
    java语言基础(变量和运算符)
    学习Java第一天,大致了解
  • 原文地址:https://www.cnblogs.com/ylbtech/p/3150362.html
Copyright © 2020-2023  润新知