zoukankan      html  css  js  c++  java
  • struct和class的不同以及struct的应用场景

    struct在C#中被用来定义结构,它是一种比类小的数据类型。和类一样都是创建对象的模板,可以有自己的数据以及处理和访问数据的方法。

    struct的用法:

        struct FurnitureSize
        {
            public double Height;
            public double Length { get; set; }
            public double Width;
            static FurnitureSize()
            {
                //nothing
            }
            public FurnitureSize(double paramLength, double paramWidth, double paramHeight = 2.2)
            {
                this.Height = paramHeight;
                this.Length = paramLength;
                this.Width = paramWidth;
            }
            public double Volume
            {
                get
                {
                    return Height* Length* Width;
                }
            }
            public double Area()
            {
                return Volume/ Height;
            }
        }

    从上边的代码片段中可以看出,struct和class几乎相同,那么struct和class除了关键字不同外,还有哪些不同呢?下面一一例举。

    1.struct不能创建自己的无参构造函数(除了静态的无参构造函数)。而类则可以。

    如果我给上边的FurnitureSize增加一个无参非静态构造函数的话就会被IntelliSense提示不能创建无参构造函数。

    而类的话就可以创建自己的无参构造器(这样做没有意义),IntelliSense检查语法通过。

     1    class ConstructorTest
     2     {
     3         public int int1;
     4         public string str1;
     5         public Boolean bool1;
     6         //static ConstructorTest() { }
     7         public ConstructorTest()
     8         {
     9 
    10         }
    11         public ConstructorTest(int paramInt,string paramString,Boolean paramBoolean)
    12         {
    13             Console.WriteLine("Constructor opened.");
    14         }
    15     }

    为什么会这样?这是因为.Net运行库实现的时候如果碰到是Class类型的时候,会先判断你是否重载了构造函数,如果重载了新的构造函数并且又没有声明无参构造函数的话,

    你想创建一个这个类的实例就只能使用新的有参构造函数。比如如果我在class ConstructorTest里没有定义无参构造函数的话,我想创建ConstructorTest的实例只能使用

    ConstructorTest dct = new ConstructorTest(1,"2",false);

    而struct不一样,.Net运行库运行struct时,不管你定义多少个有参构造函数它都会执行一遍无参构造函数,即使你没有显示的定义有参构造函数。

    2.在struct里不能在声明的时候赋初值,而类可以。

    类给字段赋初值:语法检查通过。

    因为运行struct的时候运行库无论如何都会跑一遍struct的无参构造器,而在无参构造器里会给字段赋初值,数值型默认为0,引用型初始化为null。即使在struct里提供了字段的初始值也不能绕过默认构造函数。所以在struct里不能为字段显式的赋初始值。

    3.结构是值类型,类是引用类型

    结构和其他简单类型一样被分配在栈中,所以在实例化struct对象或者给struct里的字段赋值得时候可以像下边这样。

    1             FurnitureSize fs = new FurnitureSize();
    2             fs.Height = 2.2;
    3             fs.Width = 1.8;

    也可以像这样:

    1             FurnitureSize fstmp;
    2             fstmp.Height = 2.0;
    3             fstmp.Width = 1.7;

    而类的话只能先实例化对象,然后给对象的字段赋值。

    1             ConstructorTest dct = new ConstructorTest();
    2             dct.int1 = 1;

    像这样赋值是不对的:

    4.除了Object,它不能继承别的结构。

    结构的继承链:结构派生于System.ValueType--->System.Object。不能为结构提供其他基类,每个类都派生于ValueType。

    struct适合用于小的数据结构,最好是它来定义简单类型的结合体。在为struct分配内存的时候速度非常快,在结构作用域消失的时候删除也非常快,因为它是一种值类型。当把struct作为参数传递给方法时,应该把它作为ref参数传递,以避免性能损失。

  • 相关阅读:
    Intern Day5
    PTA1007
    Intern Day5
    Intern Day2
    Intern Day5
    Intern Day2
    Intern Day2
    Intern Day2
    Intern Day1
    柯南剧场版17绝海的侦探
  • 原文地址:https://www.cnblogs.com/forbetter223/p/10108353.html
Copyright © 2011-2022 走看看