包括2种大的类型: 引用类型和值类型, 放一张图说明继承层次:

一 值类型:

内置的值类型,如下

  • 用户自定义值类型就是用户定义的枚举或者结构类型。
  • 可空类型(Nullable<T>)属于 struct 类型,也是值类型
  • 引用类型保存在内存堆中 ,值类型保存在内存栈中(少数情况下不是,如当值类型是作为,某个类的实例的字段时;或者是静态类型时,局部变量被捕获升级为密封类时)
  • Struct结构类型,默认有一个public无参构造函数,该函数内部会给内部的  字段(field)初始化。 设置的值就是相应的 default(T)。所有用户不能再手动给结构类型定义无参构造函数了,
  • ValueType这个类型本身并不是值类型,而是引用类型,属于类类型
  • 值得注意的是 Deciaml不是 基元类型  ,typeof(decimal).IsPrimitive 结果是False   。
  • 基元类型包括这些:Boolean ,Char ,SByte ,Byte ,Int16 ,UInt16 ,Int32 ,UInt32 ,Int64 ,UInt64 ,IntPtr ,UIntPtr ,Single ,Double 。

二 类型转换

虽然 long 和 int 之间并不存在继承关系 ,但是编译器允许 从int 到 long的隐私转换。

对于强制转换,.net 总是向下取整 ,而不是四舍五入那样的向上取整。如 (int)6.8F 结果是6。

三 性能方面

使用引用类型性能一般比较低,因为需要经过下面这几步

1. 内存必须从堆中分配

2.堆上分配的每个对象都有一些额外的开销成员, 必须初始化,如同步块索引,类型对象指针  

3. 引用类型内部的成员也需要初始化

4. 从托管堆分配对象时,可能会引起垃圾回收

使用值类型也需要注意:

1. 避免大量的复制操作

2. 如果有判断是否相等的操作请覆盖 ValueType基类提供的Equals方法(由于使用了反射和装箱等操作),值类型需要继承IEquatable<T>接口,然后重新Equals方法,

如:struct Vector : IEquatable<Vector> ,里编写方法public override bool Equals(object obj)  和 public bool Equals(Vector other) 。

如果有按照大小排序的操作还需要实现System..IComparable接口中的CompareTo方法和System..IComparable<T>类型安全的CompareTo方法。还可以考虑运算符重载。

3. 值类型是密封类不支持继承,值类型没有同步块索引,占用的空间更少,但也因此不能作为线程同步工具使用。值类型也没有类型对象指针

4. 如果值类型内部包含引用类型字段,则改值类型复制时,内部的引用类型字段是浅复制。也就是说多个值类型指向的是同一份引用类型。

关于常见的术语

  • 公共语言运行时 CLR (Common Language Runtime) 是 公共语言基础设施CLI(Common Language Infrastructure)的一个实现(implementation),
  • 其中 CLR 最主要的两个部分是公共类型系统 CTS(Common Type System)和 公共语言规范 CLS(Common Language Specification)。
  • 名词解释:

  CTS简单来说就是一种语法和规范,CTS定义了类型,所有服从CTS的语言都可以看成是.Net框架上的语言,但是.Net框架上的众多语言都各自实现了CTS的一小部分,这部分称为CLS。

  CLS是这些语言的程序集可以互相使用的前提。反正如果不满足CLS,你的语言就不能被其他.Net框架上的语言使用。

CLI 详细地址 :https://www.ecma-international.org/publications/files/ECMA-ST/ECMA-335.pdf

C# Language Specification : http://www.ecma-international.org/publications/files/ECMA-ST/ECMA-334.pdf

dotnet总结——类型系统的更多相关文章

  1. .NET 2.0 参考源码索引

    http://www.projky.com/dotnet/2.0/Microsoft/CSharp/csharpcodeprovider.cs.htmlhttp://www.projky.com/do ...

  2. DotNet Core 介绍

    前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...

  3. 传智播客DotNet面试题

    技术类面试.笔试题汇总(整理者:杨中科,部分内容从互联网中整理而来) 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化 ...

  4. [翻译]Go与C#对比 第三篇:编译、运行时、类型系统、模块和其它的一切

    Go vs C#, Part 3: Compiler, Runtime, Type System, Modules, and Everything Else | by Alex Yakunin | S ...

  5. 【BotR】CLR类型系统

    .NET运行时之书(Book of the Runtime,简称BotR)是一系列描述.NET运行时的文档,2007年左右在微软内部创建,最初目的是为了帮助其新员工快速上手.NET运行时:随着.NET ...

  6. dotNET跨平台相关文档整理

    一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...

  7. 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)

    很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...

  8. 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)

    在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...

  9. dotNet Core开发环境搭建及简要说明

    一.安装 .NET Core SDK 在 Windows 上使用 .NET Core 的最佳途径:使用Visual Studio. 免费下载地址: Visual Studio Community 20 ...

  10. .NET Core dotnet 命令大全

    dotnet 命令大全,让你理解dotnet 命令. 本文将以一个实例串起 dotnet 所有命令,让你玩转dotnet 命令. 本篇文章编写环境为windows 10 ,dotnet 命令同样适用于 ...

随机推荐

  1. 使用python玩转二维码!速学速用!⛵

    作者:韩信子@ShowMeAI Python3◉技能提升系列:https://www.showmeai.tech/tutorials/56 本文地址:https://showmeai.tech/art ...

  2. SpringCloud Alibaba(七) - JWT(JSON Web Token)

    原文链接: JWT详解:https://blog.csdn.net/weixin_45070175/article/details/118559272 1.什么是JWT 通俗地说,JWT的本质就是一个 ...

  3. 3D旋转不能对齐,元素边倾斜

    1 <!DOCTYPE html> 2 <html lang="en"> 3 4 <head> 5 <meta charset=" ...

  4. 【基于OpenAI的ChatGPT】搭建属于自己的微信聊天机器人(附带注册英国手机号码方式)

    前言:这几天 OpenAI的聊天机器人很火,前两天也爆发了很多关于ChatGPT接入微信的文章.我就顺便[借用别人已有的项目],来部署一个属于自己的微信聊天机器人.项目地址见下文. 1.首先需要有一个 ...

  5. before-after-hook钩子函数

    before-after-hook 最近看别人的代码,接触到一个插件,before-after-hook,百度搜一圈也没有看到什么地方有教程,看这个字面意思是一个hook,和axios里面的拦截器,v ...

  6. js实现n秒内只能点击一次操作

    <button @click="submit">5秒内只能点一次</button>

  7. 基于.NetCore开发博客项目 StarBlog - (25) 图片接口与文件上传

    前言 上传文件的接口设计有两种风格,一种是整个项目只设置一个接口用来上传,然后其他需要用到文件的地方,都只存一个引用ID:另一种是每个需要文件的地方单独管理各自的文件.这俩各有优劣吧,本项目中选择的是 ...

  8. vue3 递归组件 树形组件

    递归组件 第一种方式,直接自己调用自己 Tree.vue <template> <div class="tree"> <div v-for=" ...

  9. CH9434-MCU代码移植,芯片使用详细说明(附Linux开发资料链接)

    简介 CH9434是一款SPI转四串口转接芯片,提供四组全双工的9线异步串口,用于单片机/嵌入式/安卓系统扩展异步串口.提供25路GPIO,以及支持RS485收发控制引脚TNOW.本篇基于STM32F ...

  10. python之路46 django request对象 form表单 pycharm连接数据库 ORM简介

    静态文件配置 1.编写一个用户登录页面 2.静态文件 不怎么经常变化的文件 主要针对html文件所使用的到的各种资源 css文件.js文件.img文件.第三方框架文件 django针对静态文件资源需要 ...