C#和.NET 框架
C#和.NET框架
在.NET之前
20世纪90年代,微软平台多数程序员使用VB、C或C++。他们使用的技术都有问题。
技术 | 问题 |
---|---|
纯Win32 API | 不是面向对象,工作量比MFC大 |
MFC(Microsoft Foundation Class,微软基础类库) | 虽是面向对象,但是不一致,且过于陈旧 |
COM(Component Object Model,组件对象模型) | 虽然概念简单,但实际代码复杂丑陋 |
通病 | 以上技术都针对桌面程序开发,与Web编程大相径庭 |
由此引出下一代平台的目标
.NET时代
.Net框架特点
- 多平台
- 采用行业标准的通信协议
- 提供更安全的执行环境
.NET框架的组成
CLR(Common Language Runtime,公共语言运行库)
- 内存管理和垃圾回收
- 代码安全验证
- 代码执行、线程管理及异常处理
编程工具涵盖编码和调试所需一切
- Visual Studio IDE
- .Net兼容编译器
- 调试器
- 网站开发服务器端技术,比如ASP.NET或WCF
BCL(Base Class Library,基类库):.NET框架使用的一个大类库
大大改进的编程环境
- 面向对象
- 自动垃圾回收
CLR有GC(Garbage Collector,垃圾收集器),为你自动管理内存。(自动从内存中删除程序不再访问的对象) - 互操作性
- .NET语言允许不同.NET语言编写的软件模块无缝交互
- 一种.NET语言写的程序可以使用甚至继承用另一种.NET语言写得类,只需遵循一定规则
- 因为能容易的集成不同编程语言生成的模块,.NET框架有时被称为语言无关
- .NET提供平台调用(platform invoke,P/Invoke):允许.NET代码调用并使用非.NET代码。它可以使用标准Win32 DLL导出的纯C函数代码,比如Windows API
- .NET框架允许与COM互操作:.NET框架组件能调用COM组件,COM组件也能调用.NET组件。
- .NET语言允许不同.NET语言编写的软件模块无缝交互
- 不需要COM
摆脱了COM也就能摆脱下面这些东西,但系统中依然使用很多COM组件,所以偶尔还需要编写代码与这些组件交互,这将在25章讨论- IUnknown接口
- 类型库
- 手动引用计数
- HRESULT
- 注册表
- 简化的部署
- .NET程序无需注册表,意味着最简单情形下,复制过去就能用。
- .NET提供并行执行的特性,允许一个DLL的不同版本在同一机器上存在。即每个程序都可访问程序生成时使用的版本DLL
- 类型安全性
CLR检查并确保参数及其它数据对象的类型安全,不同编程语言编写的组件间也无问题 - 基类库
.NET框架提供一个庞大的基础类库(Base Class Library,BCL)。在写程序时可以使用其中的类- 通用基础类 : 一组强大的工具,比如文件操作、字符串操作、安全和加密。
- 集合类 : 列表、字典、散列表及位数组
- 线程和同步类 : 用于创建多线程程序
- XML类 : 用于创建、读取及操作XML文档
编译成CIL
- 程序集要么可执行,要么是DLL
- 程序集的代码不是本机代码,而是一种名为CIL(Common Intermediate Laguage,公共中间语言)的中间语言
- 程序集包含以下内容
- 程序的CIL
- 程序中使用的类型的元数据
- 对其它程序集引用的元数据
CIL又叫IL(Intermediate Language)或MSIL(Microsoft Intermediate Language)
编译成本机代码并执行
程序的CIL直到被调用才会被编译成本机代码。运行时,CLR执行下面的步骤
- 检查程序集安全特性
- 在内存中分配空间
- 把程序集中可执行代码发送给实时(Just-in-Time,JIT)编译器,把其中一部分编译成本机代码
一旦CIL被编译成本机代码,CLR就在它运行时管理它,执行释放无主内存、检查数组边界、检查参数类型、管理异常等任务。同时两个术语由此而生
- 托管代码:为.NET框架编写的代码,需要CLR
- 非托管代码:不在CLR控制下运行的代码,比如Win32 C/C++ DLL
编译和执行
CLR Common Language Runtime
CLR 在操作系统的顶层,负责管理程序执行
还提供下列服务
- 自动垃圾收集
- 安全和认证
- 通过访问BCL(Base Class Livrary,基类库)得到广泛的编程功能,包括如Web服务和数据服务之类的功能
CLI Common Language Infrastructure
过去由于语言和平台的不同,编程语言的内置类型各不相同。
例如,组成整数的位数对应不同语言和平台就有很大差别。
为了统一协作,必须有一组标准,这就是CLI(Common Language Infrastructure,公共语言基础结构)
CLI的重要组成部分
- 公共类型系统
CTS(Common Type System,公共类型系统)定义了在托管代码中一定会使用的类型特征。- 定义了一组丰富的内置类型,以及每种类型固有的、独有的特性
- .NET兼容编程语言的类型通常映射到CTS中已定义内置类型集的某一特殊子集
- CTS的所有类型都继承自公共基类-object
- 使用CTS可确保系统类型和用户定义类型能被任何.NET语言兼容使用
- 公共语言规范
CLS(Common Language Specification,公共语言规范)详细说明了一个.NET兼容编程语言的规则、属性、行为,其主题包括数据类型、类结构、参数传递。
各种缩写
C#的演化
版本 | 焦点特性 | 章节 |
---|---|---|
5.0 | 异步 | 20 |
4.0 | 命名参数和可选参数 | 5 |
3.0 | LINQ | 19 |
2.0 | 泛型 | 17 |
1.0 | C# | |
C#和.NET 框架的更多相关文章
- 避免重复造轮子的UI自动化测试框架开发
一懒起来就好久没更新文章了,其实懒也还是因为忙,今年上半年的加班赶上了去年一年的加班,加班不息啊,好了吐槽完就写写一直打算继续的自动化开发 目前各种UI测试框架层出不穷,但是万变不离其宗,驱动PC浏览 ...
- ABP入门系列(1)——学习Abp框架之实操演练
作为.Net工地搬砖长工一名,一直致力于挖坑(Bug)填坑(Debug),但技术却不见长进.也曾热情于新技术的学习,憧憬过成为技术大拿.从前端到后端,从bootstrap到javascript,从py ...
- 旺财速啃H5框架之Bootstrap(五)
在上一篇<<旺财速啃H5框架之Bootstrap(四)>>做了基本的框架,<<旺财速啃H5框架之Bootstrap(二)>>篇里也大体认识了bootst ...
- Angular企业级开发(5)-项目框架搭建
1.AngularJS Seed项目目录结构 AngularJS官方网站提供了一个angular-phonecat项目,另外一个就是Angular-Seed项目.所以大多数团队会基于Angular-S ...
- Scrapy框架爬虫初探——中关村在线手机参数数据爬取
关于Scrapy如何安装部署的文章已经相当多了,但是网上实战的例子还不是很多,近来正好在学习该爬虫框架,就简单写了个Spider Demo来实践.作为硬件数码控,我选择了经常光顾的中关村在线的手机页面 ...
- 制作类似ThinkPHP框架中的PATHINFO模式功能
一.PATHINFO功能简述 搞PHP的都知道ThinkPHP是一个免费开源的轻量级PHP框架,虽说轻量但它的功能却很强大.这也是我接触学习的第一个框架.TP框架中的URL默认模式即是PathInfo ...
- 旺财速啃H5框架之Bootstrap(四)
上一篇<<旺财速啃H5框架之Bootstrap(三)>>已经把导航做了,接下来搭建内容框架.... 对于不规整的网页,要做成自适应就有点玩大了.... 例如下面这种版式的页面. ...
- 一起学 Java(三) 集合框架、数据结构、泛型
一.Java 集合框架 集合框架是一个用来代表和操纵集合的统一架构.所有的集合框架都包含如下内容: 接口:是代表集合的抽象数据类型.接口允许集合独立操纵其代表的细节.在面向对象的语言,接口通常形成一个 ...
- Hibernatel框架关联映射
Hibernatel框架关联映射 Hibernate程序执行流程: 1.集合映射 需求:网络购物时,用户购买商品,填写地址 每个用户会有不确定的地址数目,或者只有一个或者有很多.这个时候不能把每条地址 ...
- [虾扯蛋] android界面框架-Window
从纯sdk及framwork的角度看,android中界面框架相关的类型有:Window,WindowManager,View等.下面就以这几个类为出发点来概览下安卓开发的"界面架构&quo ...
随机推荐
- vue + cesium开发(3) cesium1.87更新问题
官方在2021年11月1号更新日志中记录了他们把zip.js升级到了2.3.12以适应webpack4中的关于import.meta不兼容的语法问题,但是经过实测,1.87版本依然没有解决这个问题,所 ...
- ES6学习 第二章 变量的解构赋值
前言 该篇笔记是第二篇 变量的解构赋值. 这一章原文链接: 变量的解构赋值 解构赋值 ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 解构 ...
- 通过Rainbond的团队管理去管理已有的组织架构
针对于多团队管理我先列举几个小问题,看看大家有没有共鸣,我们在刚刚接触并使用Rainbond的时候,仅仅创建一个团队,里面创建一大堆应用,看起来特别乱,进行管理的时候呢,也会非常麻烦,尤其是当团队需要 ...
- 洛谷 P7718 -「EZEC-10」Equalization(差分转化+状压 dp)
洛谷题面传送门 一道挺有意思的题,现场切掉还是挺有成就感的. 首先看到区间操作我们可以想到差分转换,将区间操作转化为差分序列上的一个或两个单点操作,具体来说我们设 \(b_i=a_{i+1}-a_i\ ...
- 解决 VS Code 无法使用Ctrl+C等快捷键
背景 VScode 安装 Vim扩展后,无法使用Ctrl+C,Ctrl+X和 Ctrl+V等热键 解决方案 方案一 停用Vim 热键覆盖 # 原因: vim 扩展默认启用Vim ctrl键覆盖常见的V ...
- 使用CNVnator分析动植物群体拷贝数变异CNV
目录 1.安装 2.测试 3.动植物群体检测CNV 知名的拷贝数变异分析工具几乎都是为人类变异检测开发,对于动植物重测序分析有些尴尬.不过好在植物群体研究不必那么精细,用同样的工具也可做分析. 地址: ...
- GraphScope 集群部署
GraphScope 集群部署 1 k8s集群搭建 大致步骤如下: 安装docker.在ubuntu上,可以简单的通过命令sudo apt install docker.io来安装. 安装kubele ...
- javaSE高级篇1 — 异常与多线程基础
1.异常的体系结构 注:Throwable是一个类,不是一个接口,这个类里面是描述的一些Error和Exception的共性,如图所示: 异常 / 错误是什么意思? 定义:指的是程序运行过程中,可能 ...
- 学习java 7.11
学习内容: 泛型定义格式:<类型> 优点:把运行时期的问题提前到编译期间:避免了强制类型转换 泛型方法:public class Fanxing { public <T> ...
- CentOS7 搭建maven私服Nexus
下载解压 官网https://www.sonatype.com/download-oss-sonatype 下载页面 https://help.sonatype.com/repomanager2/do ...