博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C#结构(Struct)
阅读量:6828 次
发布时间:2019-06-26

本文共 3229 字,大约阅读时间需要 10 分钟。

 

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

你可能感兴趣的文章
DeDe调用body文章内容
查看>>
Eclipse的Debug(一)
查看>>
配置虚拟主机(搭建网站)
查看>>
用了N年的接口,你知道接口是什么吗?——一个简单实例说明接口的伟大意义...
查看>>
EF 数据库迁移(Migration)
查看>>
第二类斯特林数
查看>>
VFL语言使用
查看>>
艾科 驱动电路分析
查看>>
洛谷3794:签到题IV——题解
查看>>
CF Round #426 (Div. 2) The Useless Toy 思维 水题
查看>>
spring 注解
查看>>
C#获取DLL、程序路径,C#获取桌面、收藏夹等特殊系统路径
查看>>
STL标准模板库 向量容器(vector)
查看>>
plt.spy()函数
查看>>
JAVA设计模式之观察者模式
查看>>
MacOS下免密码ssh登陆
查看>>
Could not find modernizr-2.6.2 in any of the sources
查看>>
使用二次封装的openStack发行版本网卡至少有2个
查看>>
js 的 call 与 apply
查看>>
Linux下安装jdk8步骤详述
查看>>