dotnet总结——类型系统
包括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总结——类型系统的更多相关文章
- .NET 2.0 参考源码索引
http://www.projky.com/dotnet/2.0/Microsoft/CSharp/csharpcodeprovider.cs.htmlhttp://www.projky.com/do ...
- DotNet Core 介绍
前言 asp.net core rtm 6月底即将发布,自己也想着为社区做点共享,刚好最近不太忙,看到社区的小伙伴们都在为dotnet core的推广而贡献力量,项目中刚好在用rc2版本,就多写些文章 ...
- 传智播客DotNet面试题
技术类面试.笔试题汇总(整理者:杨中科,部分内容从互联网中整理而来) 注:标明*的问题属于选择性掌握的内容,能掌握更好,没掌握也没关系. 下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化 ...
- [翻译]Go与C#对比 第三篇:编译、运行时、类型系统、模块和其它的一切
Go vs C#, Part 3: Compiler, Runtime, Type System, Modules, and Everything Else | by Alex Yakunin | S ...
- 【BotR】CLR类型系统
.NET运行时之书(Book of the Runtime,简称BotR)是一系列描述.NET运行时的文档,2007年左右在微软内部创建,最初目的是为了帮助其新员工快速上手.NET运行时:随着.NET ...
- dotNET跨平台相关文档整理
一直在从事C#开发的相关技术工作,从C# 1.0一路用到现在的C# 6.0, 通常情况下被局限于Windows平台,Mono项目把我们C#程序带到了Windows之外的平台,在工作之余花了很多时间在M ...
- 免费开源的DotNet任务调度组件Quartz.NET(.NET组件介绍之五)
很多的软件项目中都会使用到定时任务.定时轮询数据库同步,定时邮件通知等功能..NET Framework具有“内置”定时器功能,通过System.Timers.Timer类.在使用Timer类需要面对 ...
- 免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
在生活中有一种东西几乎已经快要成为我们的另一个电子”身份证“,那就是二维码.无论是在软件开发的过程中,还是在普通用户的日常中,几乎都离不开二维码.二维码 (dimensional barcode) , ...
- dotNet Core开发环境搭建及简要说明
一.安装 .NET Core SDK 在 Windows 上使用 .NET Core 的最佳途径:使用Visual Studio. 免费下载地址: Visual Studio Community 20 ...
- .NET Core dotnet 命令大全
dotnet 命令大全,让你理解dotnet 命令. 本文将以一个实例串起 dotnet 所有命令,让你玩转dotnet 命令. 本篇文章编写环境为windows 10 ,dotnet 命令同样适用于 ...
随机推荐
- Scanner例题讲解
Scanner例题讲解 题:输入多个平均数,求其总和与平均数;每输入一个数用回车确认,通过输入非数字来结束输入并输出执行结果 public class Demo05 { //输入多个平均数, ...
- Velero 系列文章(一):基础
概述 Velero 是一个开源工具,可以安全地备份和还原,执行灾难恢复以及迁移 Kubernetes 集群资源和持久卷. 灾难恢复 Velero 可以在基础架构丢失,数据损坏和/或服务中断的情况下,减 ...
- 【深入浅出SpringCloud原理及实战】「SpringCloud-Alibaba系列」微服务模式搭建系统基础架构实战指南及版本规划踩坑分析
Spring Cloud Alibaba Nacos Discovery Spring Boot 应用程序在服务注册与发现方面提供和 Nacos 的无缝集成. 通过一些简单的注解,您可以快速来注册一个 ...
- 沁恒微(WCH)CH395/392配置使用,代码指南 网路接口芯片 CH395 CH392
CH395/CH392相关资料可以从官网下载具体连接可以看博客:WCH以太网相关芯片资料总结 里面是WCH官网相关信息的链接. 也可以去Gitee上下载:Gitee链接. STM32控制CH395的例 ...
- 【博学谷学习记录】超强总结,用心分享|前端CSS总结(一)
CSS总结(一) shift+alt,选中多行 外链式 <link rel="stylesheet" href="./my.css"> 1 选择器 ...
- Java类、对象以及(静态)方法的探讨
大家好,这是我的第一篇博客.在这里我想跟大家分享一下Java最基础的Class and Object,也就是我们熟说的类和对象,以及对Java方法的探讨. 初学时的我因为没有对这里面的每一行代码思考透 ...
- 闻其声而知雅意,基于Pytorch(mps/cpu/cuda)的人工智能AI本地语音识别库Whisper(Python3.10)
前文回溯,之前一篇:含辞未吐,声若幽兰,史上最强免费人工智能AI语音合成TTS服务微软Azure(Python3.10接入),利用AI技术将文本合成语音,现在反过来,利用开源库Whisper再将语音转 ...
- [数据结构]KMP算法(含next数组详解)
字符串匹配问题 给定一个字符串 s 和一个要匹配的模式串 p.模式串 p 有可能在 s 中多次出现,请求出模式串 p 在 s 中所有出现的起始位置. 暴力匹配算法 BF 算法思路 在面对字符串匹配问题 ...
- 从0到1手把手实现vite
什么是Vite? 法语:轻量化,快速 基于VUE3 非 打包开发服务器,请注意,它是个开发服务器哇!! 快速开发,按需编译,不再等待整个应用编译完成 基于原生模块系统ESModule实现 说白了,就是 ...
- Stream流中的常用方法_Foreach-Stream流中的常用方法_filter
Stream流中的常用方法_Foreach 流模型的操作很丰富,这里介绍一些常用的API.这些方法可以被分成两种︰·延迟方法∶返回值类型仍然是Stream,接口自身类型的方法,因此支持链式调用.(除了 ...

