众所周知,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类型全接触的更多相关文章

  1. Sql中获取表结构(字段名称,类型,长度,说明)

    Sql中获取表结构(字段名称,类型,长度,说明) SELECT TableName = OBJECT_NAME(c.object_id), ColumnsName = c.name, Descript ...

  2. C# 中的只读结构体(readonly struct)

    翻译自 John Demetriou 2018年4月8日 的文章 <C# 7.2 – Let's Talk About Readonly Structs>[1] 在本文中,我们来聊一聊从 ...

  3. golang中值类型/指针类型的变量区别总结

    转自:https://segmentfault.com/a/1190000012329213 值类型的变量和指针类型的变量 先声明一个结构体: type T struct { Name string ...

  4. 结构体struct、联合体union、枚举类型enum

    1.c语言中的类型 1)内置类型——char,short,int,float,double: 2)用户自定义类型(UDT)——struct结构体,union联合体,enum枚举类型 2.内存对齐 2. ...

  5. 【转】C语言中不同的结构体类型的指针间的强制转换详解

    C语言中不同类型的结构体的指针间可以强制转换,很自由,也很危险.只要理解了其内部机制,你会发现C是非常灵活的. 一. 结构体声明如何内存的分布, 结构体指针声明结构体的首地址, 结构体成员声明该成员在 ...

  6. C语言 Struct 结构体在 Java 中的体现

    大一整个学期完成了 C 语言的学习,大二就进入了Java 的学习. 和C语言一样,我们都会尝试写一个小小的学生管理系统什么的,学习过 C 语言同学知道,在管理系统中 Struct 结构体是个很好用的东 ...

  7. 03C++语言对C的增强——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符

    1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.C++对c语言register的增强 register关键字 ...

  8. C++语言对C的增强(1)——实用性、变量检测、struct类型、C++中所有变量和函数都必须有类型、bool类型、三目运算符

    1.“实用性”增强 C语言中的变量都必须在作用域开始的位置定义,C++中更强调语言的“实用性”,所有的变量都可以在需要使用时再定义. 2.变量检测加强 在C语言中,重复定义多个同名的全局变量是合法的: ...

  9. C# step by step 学习笔记8 CHAPTER 9 使用枚举和结构创建值类型

    C# 2012 step by step 学习笔记8 CHAPTER 9 使用枚举和结构创建值类型 本章内容 声明一个枚举类型 创建并使用一个枚举类型 声明一个结构类型 创建并使用一个结构类型 解释结 ...

随机推荐

  1. AnyCAD三维控件(转)

    在WinForm中可以方便的集成AnyCAD.Net三维控件,只需要以下几部即可完成. 一.添加DLL程序集 AnyCAD.Foundation.Net.dll AnyCAD.Presentation ...

  2. JavaFX窗体设置无边框

    public void start(Stage stage) throws Exception { longStart(); Parent root = FXMLLoader.load(getClas ...

  3. rtsp向rtmp推流

    package com.awifi.video.media.test; import org.bytedeco.javacpp.avcodec; import org.bytedeco.javacv. ...

  4. 任务调度之Quartz.Net可视化界面

    上一篇关于任务调度Quartz.Net的文章中介绍了其三个核心对象IScheduler.IJob和ITrigger,我们已经知道了其基本的使用方法,可以在控制台当中运行监控.但是在实际中我们往往需要有 ...

  5. nohup保证程序后台运行

    前言 我们运行某些命令的时候,它会默认在前台执行.如果要进行其他操作,则需要先停掉此程序.然后就蛋疼了.   解决 碰到这种情况,我们可以使用"nohup"命令和"&am ...

  6. vmware linux 硬盘空间不足时增加硬盘并挂载

    不同的版本的vmware在设置界面中可能稍有不同,基本是一致的. 还有一种方式是扩展,这里没有记录,扩展时需要在虚拟机关机状态下. 1.选择在vmware中点击设置并打开,将光标定位在hard Dis ...

  7. LeetCode 171. Excel表列序号(Excel Sheet Column Number) 22

    171. Excel表列序号 171. Excel Sheet Column Number 题目描述 给定一个 Excel 表格中的列名称,返回其相应的列序号. 每日一算法2019/5/25Day 2 ...

  8. LeetCode 110. 平衡二叉树(Balanced Binary Tree) 15

    110. 平衡二叉树 110. Balanced Binary Tree 题目描述 给定一个二叉树,判断它是否是高度平衡的二叉树. 本题中,一棵高度平衡二叉树定义为: 一个二叉树每个节点的左右两个子树 ...

  9. [转帖]Hive基础(一)

    Hive基础(一) 2018-12-19 15:35:03 人间怪物 阅读数 234   版权声明:本文为博主原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明. 本文链接 ...

  10. Linux shell 中 & && [] [[]] () [] 含义

    | 语法:command 1 | command 2 功能:把第一个命令 command 1 执行的结果作为 command 2 的输入传给 command 2 & & 放在启动参数后 ...