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。
最新文章
- MongoDB和Redis-NoSQL数据库-文档型-内存型
- IOS 二维码的实现
- DEM数据如何生成高程点
- Java多线程--wait和join
- 【转】Oracle中如何用一条SQL快速生成10万条测试数据
- hexo博客的优化与配置——加入统计代码
- sublime配置攻略
- MySQL分区表的局限和限制
- iOS监听模式之KVO、KVC的高阶应用
- [宽度优先搜索] FZU-2150 Fire Game
- 让Python代码更快运行的 5 种方法
- Learning-Python【13】:迭代器和生成器
- aop 日志统一处理
- Check Kernel version of J2EE Engine
- 基于GoogLeNet的不同花分类微调训练案例
- 题解 P1378 【油滴扩展】
- Golang 要点汇总
- 【hh】我胡汉三又回来了
- laravel 5.7 resources 本地化 简体中文
- golang 聊天室
热门文章
- 一个兼容 node 与浏览器的模块写法
- Hive Essential (4):DML-project,filter,join,union
- Python - Django - 组件
- python中的随机函数random的用法示例
- 【物联网】esp8266+LCD
- Js获取file上传控件的文件路径总结
- Python:实现图片裁剪的两种方式——Pillow和OpenCV
- bootstrap-table中使用bootstrap-switch开关按钮
- linux系统卡顿 性能分析
- cudaGetDevice() failed. Status: cudaGetErrorString symbol not found.怎么解决