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. node 中 npm报错 Error: ENOENT, stat 'C:\Users\Administrator\AppData\Roaming\npm'

    今天在看node书本时,安装express,看看里面的包.没想到出现这样一种情况. 报错了.后来思考了一下,可能是修改了node的默认安装路径.于是准备在出错的路径下建一个npm文件夹. 注意,有个时 ...

  2. video2gift环境安装(Theano等)

    pip install Theano http://deeplearning.net/software/theano/install_centos6.html pip install moviepy ...

  3. Python - 第一个 Django 项目

    Django 的安装: pip3 install django==1.11.11 pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple/ d ...

  4. spring boot + slf4j + log4j配置

    https://docs.spring.io/spring-boot/docs/1.5.6.RELEASE/reference/htmlsingle/#boot-features-logging ht ...

  5. 转 :关于springmvc使用拦截器

    原博客: http://elim.iteye.com/blog/1750680 SpringMVC 中的Interceptor 拦截器也是相当重要和相当有用的,它的主要作用是拦截用户的请求并进行相应的 ...

  6. Rplot

    #!/usr/bin/Rscriptlibrary(ggplot2) cf = read.table(file = 'result_sort.txt', header = TRUE, sep='\t' ...

  7. 第11章 分布式服务跟踪: Spring Cloud Sleuth

    通常一个由客户端发起的请求在后端系统中会经过多个不同的微服务调用来协同产生最后的请求结果, 在复杂的微服务架构系统中, 几乎每一个前端请求都会形成一条复杂的分布式服务调用链路, 在每条链路中任何一个依 ...

  8. new及placememt new 异同点

    new与定位new 区别如下: 简单概括: new 分配的内存地址空间来自于heap堆,用完需使用delete 释放内存 定位new 使用的不是heap堆内存,因此不需要使用delete 释放 定位n ...

  9. 使用Spring的HttpInvoker

    Spring开发团队意识到RMI服务和基于HTTP的服务(例如Hessian和Burlap)之间的空白.一方面,RMI使用Java标准的对象序列化机制,但是很难穿透防火墙.另一方面,Hessian和B ...

  10. Windows Intel VT-x开启

    解决虚拟机安装64位系统“此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态”的问题 背景:win7 旗舰版 64位+VMware 10.0 启动虚拟机时报错 问题:已将该虚拟机 ...