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参数传递,以避免性能损失。

原文地址:https://www.cnblogs.com/forbetter223/p/10108353.html