C#中的struct(结构)为值类型,struct类型全接触
众所周知,struct类型和class类型非常相似,尤其是在C++中,class可以办到的事struct几乎都可以实现。在C#中struc类型依然存在,它的用处相对来说已经显得越来越不重要,这里主要讲述一下C#中struct和class的一个最大不同点,在C#中struct是值类型,而class是引用类型。
例:
class Program
{
struct Test
{
public int a ;
}
static void Main(string[] args)
{
Test test1 = new Test();
test1.a = 1;
Test test2 = test1;
Console.WriteLine("test1.a=" + test1.a);
Console.WriteLine("test2.a=" + test2.a);
test2.a = 2;
Console.WriteLine("test1.a=" + test1.a);
Console.WriteLine("test2.a=" + test2.a);
Console.ReadLine();
}
}
执行上面的程序,输出地结果会是:
test1.a=1
test2.a=1
test1.a=1
test2.a=2
test2的变化对test1没有任何的影响,test1和test2对应两个不同的内存区域,如果把struct改为class,则会输出:
test1.a=1
test2.a=1
test1.a=2
test2.a=2
C#把基本类型规定为值类型,而把包含许多字段的较大类型规定为引用类型,C#设计这种方式的最大原因是可以得到最大的性能。当我们进行项目开发的时候,自定义类型可以选择class也可以选择struct,但如果希望自己的类型是值类型(有时候这样做是非常必要的),则应把它声明为一个结构类型。
此外,结构还有很多特性需要我们注意,总结如下:
1、所有结构都从Object类派生,不能从其他类或者结构派生,也不能作为其他类或结构的基类。
2、结构中的字段默认是私有的,并且结构的字段不能在声明时显示初始化。
3、结构可以有一个或多个构造方法,但是不允许自己定义默认构造函数,而且编译器要求自定义构造函数都要初始化结构的所有字段。
4、结构的默认构造函数将所有值类型的字段设为0,所有引用类型的字段设为空引用。
下面对1进行一下说明,结构类型不能从其他类或结构派生是指我们不能显示的加继承语句“:SomeClass”,实际上在我们定义结构类型的时候,系统进行了隐式继承,所继承的基类就是System.ValueType。请看下面的示例:
struct Test
{
public int a;
public int b;
}
上面定义了一个结构类型Test,下面是其IL代码:
.class private sequential ansi sealed beforefieldinit ConsoleApplication1.Test
extends [mscorlib]System.ValueType
{
} // end of class ConsoleApplication1.Test
我们可以很清楚的看到Test继承了System.ValueType类。读者朋友可以查看一下.NET所有基本数据类型的源代码,他们都是结构类型的(用struct关键字定义的),并且在定义的过程中隐式继承了System.ValueType。
C#中的struct(结构)为值类型,struct类型全接触的更多相关文章
- Sql中获取表结构(字段名称,类型,长度,说明)
Sql中获取表结构(字段名称,类型,长度,说明) SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Descript ...
- C# 中的只读结构体(readonly struct)
翻译自 John Demetriou 2018年4月8日 的文章 <C# 7.2 – Let's Talk About Readonly Structs>[1] 在本文中,我们来聊一聊从 ...
- golang中值类型/指针类型的变量区别总结
转自:https://segmentfault.com/a/1190000012329213 值类型的变量和指针类型的变量 先声明一个结构体: type T struct { Name string ...
- 结构体struct、联合体union、枚举类型enum
1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...
- 【转】C语言中不同的结构体类型的指针间的强制转换详解
C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...
- C语言 Struct 结构体在 Java 中的体现
大一整个学期完成了 C 语言的学习,大二就进入了Java 的学习. 和C语言一样,我们都会尝试写一个小小的学生管理系统什么的,学习过 C 语言同学知道,在管理系统中 Struct 结构体是个很好用的东 ...
- 03C++语言对C的增强——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符
1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.C++对c语言register的增强 register关键字 ...
- C++语言对C的增强(1)——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符
1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.变量检测加强 在C语言中,重复定义多个同名的全局变量是合法的: ...
- C# step by step 学习笔记8 CHAPTER 9 使用枚举和结构创建值类型
C# 2012 step by step 学习笔记8 CHAPTER 9 使用枚举和结构创建值类型 本章内容 声明一个枚举类型 创建并使用一个枚举类型 声明一个结构类型 创建并使用一个结构类型 解释结 ...
随机推荐
- 安卓 android studio 报错 All flavors must now belong to a named flavor dimension. Learn more at https://d.android.com
这个问题是Android studio升级到3.0之后,运行的时候会提示gradle要升级到3.5版本才能编译.于是我把我的gradle升级到了 gradle-4.1-milestone-1 版本,是 ...
- 【436】Solution for LeetCode Problems
Coding everyday. ^_^ 1. Two Sum 重点知识:指针可以存储数值,通过 malloc 新建数组 int* returnSize:Size of the return arra ...
- 123457123457#0#----com.DoraGame.ShiZi75--前拼后广--识字dora
com.DoraGame.ShiZi75--前拼后广--识字dora
- log4net示例2-日志输入存入Access(转)
需求:基于log4net组建,创建Console程序将日志输出到Access数据库. 具体实施: (1)创建控制台程序. (2)控制台程序中,添加一个纯文本文件,文件命名为“log-Access.se ...
- 基于Java API for WebSocket (JSR-356)的标准websocket客户端
maven依赖 springboot <dependency> <groupId>org.springframework.boot</groupId> <ar ...
- (十三)class文件结构:常量池(转)
Class类文件的结构 全局规范 1.任何一个Class文件都对应着唯一一个类或接口的定义信息,但反过来说,类或接口并不一定都得定义在文件里(譬如类或接口也可以通过类加载器直接生成).本章中,只是通俗 ...
- 客户端业务层(非数据层json或xml层)的数据结构
private string errorMessage = "系统繁忙,请稍后重试";//不成功时的提示信息:成功时,可以忽略掉 private int result ...
- dockerfile里面的内容编写顺序,必须严格按照顺序编写,否则编译不成
完整文档请参照https://www.cnblogs.com/effortsing/p/10480972.html 这里只介绍dockerfile里面的步骤顺序 cat>/home/jenkin ...
- 《MySQL必知必会》学习笔记——附录B 样例表
附录B 样例表 本附录简要描述本书中所用的表及它们的用途. 编写SQL语句需要对基础数据库的设计有良好的理解.不知道什么信息存储在什么表中,表之间如何关联以及行内数据如何分解,是不可能编写出高效的SQ ...
- jQuery调用WebService返回JSON数据
相信大家都比较了解JSON格式的数据对于ajax的方便,不了解的可以从网上找一下这方面的资料来看一下,这里就不多说了,不清楚的可以在网上查一下,这里只说一下因为参数设置不当引起的取不到返回值的问题. ...