C#结构(Struct)

Struct简介:

结构是使用 struct 关键字定义的,与类相似,都表示可以包含数据成员和函数成员的数据结构。

1.结构是一种值类型,并且不需要堆分配。 它都放在堆栈上
2.结构的实例化可以不使用 new 运算符。类必须用new初始化,否则会爆仓哦

3.在结构声明中,除非字段被声明为 const 或 static,否则无法初始化。
4.结构类型永远不是抽象的,并且始终是隐式密封的,因此在结构声明中不允许使用abstract和sealed修饰符。

5.结构不能声明默认构造函数(没有参数的构造函数)或析构函数,但可以声明带参数的构造函数。
6.结构可以实现接口,但不能从另一个结构或类继承,而且不能作为一个类的基类,所有结构都直接继承自 System.ValueType,后者继承自 System.Object
7.结构在赋值时进行复制。 将结构赋值给新变量时,将复制所有数据,并且对新副本所做的任何修改不会更改原始副本的数据。 在使用值类型的集合(如 Dictionary<string, myStruct>)时,请务必记住这一点。
8.结构类型的变量直接包含了该结构的数据
而类类型的变量所包含的只是对相应数据的一个引用被引用的数据称为对象”)但是结构仍可以通过ref和out参数引用方式传递给函数成员。
9.结构可用作可以为 null 的类型,因而可向其赋 null 值。
注意:因为结构一般用的比较少,所以也就不用深究,了解其大概功能即可;

下面通过一个例子,来说明结构的用法以及他和类的区别:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Struct
{

    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("-----------------Struct Test------------------");
            structPerson sp1 = new structPerson(12, "nomei");
            Console.WriteLine("old sp1:" + sp1.ToString());
            structPerson sp2;
            sp2 = sp1;
            sp1.age = 100;
            sp1.name = "hihi";
            Console.WriteLine("sp1 changed:" + sp1.ToString());
            Console.WriteLine("sp2:" + sp2.ToString());

            Console.WriteLine("-----------------Class Test------------------");

            //classPerson cp1;
            //cp1.name = "nihao";   //会提示错误,使用为赋值的变量。这时只是声明了类型的对象,并未实例化,也就是说在堆栈上只                                        有对象的引用,在堆上没有具体的对象
            classPerson cp1 = new classPerson(23, "nice to meet you");
            Console.WriteLine("old cp1:"+cp1.ToString());

            classPerson cp2 = cp1;
            cp1.name = "i don not know";
            Console.WriteLine("change cp1:"+cp2.ToString());
            Console.WriteLine("cp2:"+cp2.ToString());
            Console.ReadKey();

        }
    }

    struct structPerson
    {
        public int age;              //一般变量是不能赋初值
        public string name;
        public static string information = "nimei";   //静态变量可以赋初值

        //  public structPerson() { }   //不能包含无参数的构造函数
        public structPerson(int age, string name)   //可以实现有参数的构造函数
        {
            this.age = age;
            this.name = name;
        }

        public override string ToString()   //重写tostring()方法
        {
            return "name=" + name + "," + "age=" + age;
        }

    }

    class classPerson
    {
        public int age;
        public string name;
        public string information = "jsf"; //一般变量可以赋值,不同于struct

        public classPerson() { }  //可以拥有自己的无惨构造函数
        public classPerson(int age, string name)
        {
            this.age = age;
            this.name = name;
        }

        public override string ToString()
        {
            return "age=" + age + ",name" + name;
        }


    }
}

-----------------Struct Test------------------
old sp1:name=nomei,age=12
sp1 changed:name=hihi,age=100
sp2:name=nomei,age=12
-----------------Class Test------------------
old cp1:age=23,namenice to meet you
change cp1:age=23,namei don not know
cp2:age=23,namei don not know

从执行结果可以发现:

对于结构,因为其在堆栈上是一种值类型,所以不用初始化,复制的时候也是复制一个对象的副本

而对于类,他是在堆栈中存放他的对象的引用,而在堆中存放他的对象,所以用的时候必须对他进行初始化。复制的时候也只是复制对象的引用而已

原文地址:https://www.cnblogs.com/fjsnail/p/3234439.html