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 命令同样适用于 ...
随机推荐
- day31-JQuery04
JQuery04 6.jQuery的DOM操作02 6.9常用遍历节点方法 取得匹配元素的所有子元素组成的集合:children(),该方法只考虑子元素而不考虑任何后代元素 取得匹配元素后面的同辈元素 ...
- 【每日一题】【递归实现、自下而上、优化】-2022年1月12日-NC68 跳台阶
描述一只青蛙一次可以跳上1级台阶,也可以跳上2级.求该青蛙跳上一个 n 级的台阶总共有多少种跳法(先后次序不同算不同的结果). 数据范围:0 \leq n \leq 400≤n≤40要求:时间复杂度: ...
- 网络编程 - OSI七层协议详解
目录 网络编程基础 软件开发架构 网络编程简介 OSI七层协议简介 OSI协议之物理连接层 OSI协议之数据链路层 网络相关专业名词 OSI之网络层 OSI协议之传输层 传输层之TCP协议/UDP协议 ...
- 一文带你搞懂 Google 发布的新开源项目 GUAC
随着软件供应链攻击的显著增加,以及 Log4j 漏洞带来的灾难性后果和影响,软件供应链面临的风险已经成为网络安全生态系统共同关注的最重要话题之一.根据业内权威机构 Sonatype 发布的2022软件 ...
- 解决aspnetcore-browser-refresh.js:234 WebSocket connection to 'wss://localhost:62356/Admin/' failed问题
前言 前段时间升级了Visual Studio到v17.1.1最新版本,然后今天来运行之前的一个.net5项目一直提示:aspnetcore-browser-refresh.js:234 WebSoc ...
- MySQL存储 pymysql模块
目录 pymysql模块 基本使用 cursor=pymysql.cursors.DictCursor 获取数据 fetchall 移动光标 scroll 增删改二次确认 commit autocom ...
- TCP\UDP协议 socket模块
目录 传输层主要协议 TCP协议 三次握手 TCP协议反馈机制 四次挥手 洪水攻击 UDP协议 socket模块 socket代码简介 socket.socket() server.bind() se ...
- python连接MySQL数据库实现(用户登录测试功能)pymysql
pymysql PyMySQL 是一个纯 Python 实现的 MySQL 客户端操作库,支持事务.存取过程.批量执行,实现增删改查等 # 注册 def register(cursor): usern ...
- 网络爬虫之requests模块,自动办公领域之openpyx模块
一.第三方模块的下载与使用 第三方模块:别人写的模块,一般情况下功能都特别强大 我们如果想使用第三方模块,第一次必须先下载,后面才可以反复使用(等同于内置模块) 下载第三方模块的方式 1. pi ...
- LoadRunner11录制脚本
1.打开LoadRunner11后界面如下: 2.点击"创建/编辑脚本",会打开一个新窗口,如下: 3.这里新建一个web/html格式的测试.点击"文件"-& ...