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

从执行结果可以发现:

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

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

C#结构(Struct)的更多相关文章

  1. objective-C学习笔记(二)类 class 和 结构 struct

    Objective-C的类型 引用类型 类 class 指针 pointer 块 block 值类型 基础数值类型 结构 struct 枚举 enum 类型装饰 协议 protocol 类别 cate ...

  2. go语言中结构struct

    package main; import "fmt" //结构struct //定义Person结构 type Person struct { name string; age i ...

  3. 【转】结构struct 联合Union和枚举Enum的细节讨论

    结构struct 联合Union和枚举Enum的细节讨论 联合(Union)是一种构造数据类型,它提供了一种使不同类型数据类型成员之间共享存储空间的方法,同时可以实现不同类型数据成员之间的自动类型转换 ...

  4. 【Golang】Go 通过结构(struct) 实现接口(interface)

    一.通过结构(struct) 实现 接口(interface) 1.在了解iris框架的时候,经常看到有这样去写的使用一个空结构体作为接收器,来调用方法,有点好奇这样做有什么意义. 解释:在 Go 语 ...

  5. 结构struct

    1.结构变量 1)定义结构类型 struct student { char *name; int age; int score[3]; }; 2)定义结构变量 struct student stu1, ...

  6. .NET中类(class)与结构(struct)

    结构是值类型:值类型在栈上分配空间:  类是引用类型:引用类型在堆栈上分配空间:  虽然结构与类的类型不一样,可是他们的基类型都是对象(object),c#中所有类型的基类型都是object:  虽然 ...

  7. 详说C#中的结构struct

    一.结构和类的区别 1.结构的级别和类一致,写在命名空间下面,可以定义字段.属性.方法.构造方法也可以通过关键字new创建对象. 2.结构中的字段不能赋初始值. 3.无参数的构造函数无论如何C#编译器 ...

  8. go基础系列:结构struct

    Go语言不是一门面向对象的语言,没有对象和继承,也没有面向对象的多态.重写相关特性. Go所拥有的是数据结构,它可以关联方法.Go也支持简单但高效的组合(Composition),请搜索面向对象和组合 ...

  9. c# 结构 struct

    结构是使用 struct 关键字定义的,与类相似,都表示可以包含数据成员和函数成员的数据结构. 一般情况下,我们很少使用结构,而且很多人也并不建议使用结构,但作为.NET Framework 一般型別 ...

  10. C#中结构struct的使用

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

随机推荐

  1. 关于模拟admin实现stark组件的知识点

    一. url知识 还记得include分发么?里面的参数都可以有些什么? urlconf_module本质是返回的是模块路径对象 def include(arg, namespace=None, ap ...

  2. node的超时timeout

    如果在指定的时间内服务器没有做出响应(可能是网络间连接出现问题,也可能是因为服务器故障或网络防火墙阻止了客户端与服务器的连接),则响应超时,同时触发http.ServerResponse对象的time ...

  3. 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)

    Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...

  4. TIMEQUEST学习之黑金动力(四)

    现在知道时序约束主要是FPGA to ic,或者ic to FPGA. 上图可以表示FPGA to IC, IC to FPGA. fpga2ic:fpga2ext 是 fpga 致 ic 信号的走线 ...

  5. Firefox显示 您的链接不安全 的解决办法

    Firefox浏览器,今天突然打开网页的时候提醒,“您的链接不安全”,于是网页怎么刷新都打不开.后来几经查询终于解决,下面告诉大家该如何解决这种情况. 百度经验:jingyan.baidu.com 工 ...

  6. css/css3实现未知宽高元素的垂直居中和水平居中

    题目:.a{ width: 200px; height: 200px; background-color: #ccc;} <body> <div class="a" ...

  7. 基于aop的redis自动缓存实现

    目的: 对于查询接口所得到的数据,只需要配置注解,就自动存入redis!此后一定时间内,都从redis中获取数据,从而减轻数据库压力. 示例: package com.itliucheng.biz; ...

  8. python中nltk的下载安装方式

    首先去http://nltk.org/install.html下载相关的安装程序,然后 在cmd窗口中,进入到python的文件夹内的 Scripts内,运行easy_install pip 安装Py ...

  9. python变量、引用、拷贝之间的关系

    Python中一切皆为对象,不管是集合变量还是数值型or字符串型的变量都是一个引用,都指向对应内存空间中的对象. 简而言之: 变量直接赋值:新变量本身及其内部的元素都与原变量指向相同的内存空间,并且值 ...

  10. 初始mysql语句

    操作文件夹(库) 增 : create database db1 charset utf8; 查 : #查看当前创建的数据库 show create database db1; #查看所有的数据库 s ...