众所周知,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。

最新文章

  1. MongoDB和Redis-NoSQL数据库-文档型-内存型
  2. IOS 二维码的实现
  3. DEM数据如何生成高程点
  4. Java多线程--wait和join
  5. 【转】Oracle中如何用一条SQL快速生成10万条测试数据
  6. hexo博客的优化与配置——加入统计代码
  7. sublime配置攻略
  8. MySQL分区表的局限和限制
  9. iOS监听模式之KVO、KVC的高阶应用
  10. [宽度优先搜索] FZU-2150 Fire Game
  11. 让Python代码更快运行的 5 种方法
  12. Learning-Python【13】:迭代器和生成器
  13. aop 日志统一处理
  14. Check Kernel version of J2EE Engine
  15. 基于GoogLeNet的不同花分类微调训练案例
  16. 题解 P1378 【油滴扩展】
  17. Golang 要点汇总
  18. 【hh】我胡汉三又回来了
  19. laravel 5.7 resources 本地化 简体中文
  20. golang 聊天室

热门文章

  1. 一个兼容 node 与浏览器的模块写法
  2. Hive Essential (4):DML-project,filter,join,union
  3. Python - Django - 组件
  4. python中的随机函数random的用法示例
  5. 【物联网】esp8266+LCD
  6. Js获取file上传控件的文件路径总结
  7. Python:实现图片裁剪的两种方式——Pillow和OpenCV
  8. bootstrap-table中使用bootstrap-switch开关按钮
  9. linux系统卡顿 性能分析
  10. cudaGetDevice() failed. Status: cudaGetErrorString symbol not found.怎么解决