• 欢迎访问交通人网站!
  • 分享一款小游戏:信任的进化
  •    发表于8年前 (2016-01-17)  热点资讯 |   抢沙发  690 
    文章评分 2 次,平均分 4.5

    在 C# 中,数据类型大致可以分为两类,一类是值类型,一类是引用类型。初学者往往会被类型之间的相互赋值搞的很迷惑,尤其是引用类型变量的相互赋值。

    在 C# 中,变量是值还是引用仅取决于其数据类型。C# 的基本数据类型都以平台无关的方式来定义,C# 的预定义类型并没有内置于语言中,而是内置于 .NET Framework 中。.NET 使用通用类型系统(CTS)定义了可以在中间语言(IL)中使用的预定义数据类型,所有面向.NET的语言都最终被编译为 IL,即编译为基于 CTS 类型的代码。

    通用类型的系统的功能:

    • 建立一个支持跨语言集成、类型安全和高性能代码执行的框架。
    • 提供一个支持完整实现多种编程语言的面向对象的模型。
    • 定义各语言必须遵守的规则,有助于确保用不同语言编写的对象能够交互作用。

    例如,在 C# 中声明一个 int 变量时,声明的实际上是 CTS 中 System.Int32 的一个实例。这具有重要的意义:

    • 确保 IL 上的强制类型安全;
    • 实现了不同 .NET 语言的互操作性;
    • 所有的数据类型都是对象。它们可以有方法,属性等。

    C# 的所有值类型均隐式派生自 System.ValueType:

    • 结构体:struct(直接派生于System.ValueType);
    • 数值类型
      • 整 型:sbyte(System.SByte 的别名),short(System.Int16),int(System.Int32),long (System.Int64),byte(System.Byte),ushort(System.UInt16),uint (System.UInt32),ulong(System.UInt64),char(System.Char);
      • 浮点型:float(System.Single),double(System.Double);
      • 用于财务计算的高精度decimal型:decimal(System.Decimal)。
    • bool 型:bool(System.Boolean 的别名);
    • 用户定义的结构体(派生于 System.ValueType)。
    • 枚举:enum(派生于 System.Enum);
    • 可空类型(派生于 System.Nullable<T> 泛型结构体,T 实际上是 System.Nullable<T> 的别名)。

    C# 有以下一些引用类型

    • 数组(派生于System.Array)
    • 用户用定义的以下类型:
      • 类:class(派生于 System.Object);
      • 接口:interface(接口不是一个“东西”,所以不存在派生于何处的问题。Anders 在《C# Programming Language》中说,接口只是表示一种约定 [contract]);
      • 委托:delegate(派生于System.Delegate)。
    • object(System.Object 的别名);
    • 字符串:string(System.String 的别名)。

    可以看出:

    • 引用类型与值类型相同的是,结构体也可以实现接口;
    • 引用类型可以派生出新的类型,而值类型不能;
    • 引用类型可以包含null值,值类型不能(可空类型功能允许将 null 赋给值类型);
    • 引用类型变量的赋值只复制对对象的引用,而不复制对象本身。而将一个值类型变量赋给另一个值类型变量时,将复制包含的值

    现在举2个例子,对值类型和引用类型的变量赋值一一说明。

    值类型变量的赋值: 值类型变量中保存的是实际数据,在赋值的时候只是把数据复制一份,然后赋给另一个变量。

    例子1:

    引用类型变量的赋值: 引用类型变量中保存的是“指向实际数据的引用指针”。在进行赋值操作的时候,它和值类型一样,也是先有一个复制的操作,不过它复制的不是实际的数据,而是引用(真实数据的内存地址)。

    所以引用类型的变量在赋值的时候,赋给另一变量的实际上是内存地址。这样赋值完成后,2 个引用变量中保存的是同一引用,他们的指向完全一样。

    例子2:

    从上面 2 个例子可以看出,值类型变量的赋值操作,仅仅是 2 个实际数据之间的复制。而引用类型变量的赋值操作,复制的是引用,即内存地址,由于赋值后二者都指向同一内存地址,所以改变其中一个,另一个也会跟着改变,二者就像绑定在了一起。

    打赏
    微信
    支付宝
    微信二维码图片

    微信 扫描二维码打赏

    支付宝二维码图片

    支付宝 扫描二维码打赏

     

    除特别注明外,本站所有文章均为交通人原创,转载请注明出处来自http://www.hijtr.com/csharp-difference-between-value-type-and-reference-type/

    交通人博客是交通人工作室(JTR Studio)建立的交通人系列网站之一,是交通人工作室的主阵地,旨在整合和分享交通行业相关资讯,具体包括但不限于行业新闻、行业动态,以及行业相关规范、书籍、报告和软件等资源。

    发表评论

    表情 格式

    *

    暂无评论

    
    切换注册

    登录

    忘记密码 ?

    切换登录

    注册

    扫一扫二维码分享