C# 图解教程 第一章 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# |
PS:最后附上本书PDF扫描版下载地址
C# 图解教程 第一章 C#和.NET框架的更多相关文章
- C#图解教程第一章 C#和.NET框架
1.1 在.NET之前 C#发音:see shap 1.1.1 20世纪90年代后期的Windows编程 20世纪90年代后期各语言缺点: 1.纯Win32 API不是面向对象的,而且工作量比M ...
- 村田噪声抑制基础教程-第一章 需要EMI静噪滤波器的原因
1-1. 简介 EMI静噪滤波器 (EMIFIL®) 是为电子设备提供电磁噪声抑制的电子元件,配合屏蔽罩和其他保护装置一起使用.这种滤波器仅从通过连线传导的电流中提取并移除引起电磁噪声的元件.第1章说 ...
- [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍
注:为了看上去比较清晰这里只转载了中文 原地址: [Learn Android Studio 汉化教程]第一章 : Android Studio 介绍 本章将引导您完成安装和设置开发环境,然后你就可 ...
- javascript进阶教程第一章案例实战
javascript进阶教程第一章案例实战 一.学习任务 通过几个案例练习回顾学过的知识 通过练习积累JS的使用技巧 二.实例 练习1:删除确认提示框 实例描述: 防止用户小心单击了“删除”按钮,在用 ...
- [ABP教程]第一章 创建服务端
Web应用程序开发教程 - 第一章: 创建服务端 关于本教程 在本系列教程中, 你将构建一个名为 Acme.BookStore 的用于管理书籍及其作者列表的基于ABP的应用程序. 它是使用以下技术开发 ...
- 《进击吧!Blazor!》系列入门教程 第一章 8.部署
<进击吧!Blazor!>是本人与张善友老师合作的Blazor零基础入门教程视频,此教程能让一个从未接触过Blazor的程序员掌握开发Blazor应用的能力. 视频地址:https://s ...
- 《Entity Framework 6 Recipes》翻译系列 (1) -----第一章 开始使用实体框架之历史和框架简述
微软的Entity Framework 受到越来越多人的关注和使用,Entity Framework7.0版本也即将发行.虽然已经开源,可遗憾的是,国内没有关于它的书籍,更不用说好书了,可能是因为EF ...
- OpenGL完全教程 第一章 初始化OpenGL
第一章 初始化OpenGL 无论是什么东西,要使用它,就必须对它进行初始化.如果你之前使用过GDI,你应该也多多少少了解到GDI在绘制图形之前要为之创建渲染环境.OpenGL也一样.本章给出的代码,大 ...
- python 教程 第一章、 简介
第一章. 简介 官方介绍: Python是一种简单易学,功能强大的编程语言,它有高效率的高层数据结构,简单而有效地实现面向对象编程.Python简洁的语法和对动态输入的支持,再加上解释性语言的本质,使 ...
随机推荐
- 2018/1/21 Netty通过解码处理器和编码处理器来发送接收POJO,Zookeeper深入学习
package com.demo.netty; import org.junit.Before;import org.junit.Test; import io.netty.bootstrap.Boo ...
- 对Javascript到底了解多少,一测便知道
笔者在这里附上一段代码,请读者思考一下程序的运行结果: console.log(a); //??? a(); var a=3; function a(){ console.log(10); } con ...
- MySQL的字符编码设置
-- 创建数据库时,设置数据库的编码方式 -- CHARACTER SET:指定数据库采用的字符集,utf8不能写成utf-8-- COLLATE:指定数据库字符集的排序规则,utf8的默认排序规则为 ...
- cnblogs的使用
cnblogs的使用 选择使用cnblogs而不是csdn,答案是很明显的.csdn每次创建博客之后会有一段时间的审核期,这大大的影响了用户体验.此外,cnblogs的用户群以及使用模式有着很大的诱惑 ...
- zabbix客户端一键安装脚本(主动模式监控)
#!/bin/bash basepath=$(cd `dirname $0`; pwd)SHELL_DIR="${basepath}/shell"PACKAGE_DIR=" ...
- 使用scp从远程服务器下载文件到本地
[下载远程文件到本地] scp -P 6008 root@192.168.1.123:/usr/data/1.zip /Users/abc/www [上传本地文件到远程] scp -P 6008 ...
- 图论算法-网络最大流【EK;Dinic】
图论算法-网络最大流模板[EK;Dinic] EK模板 每次找出增广后残量网络中的最小残量增加流量 const int inf=1e9; int n,m,s,t; struct node{int v, ...
- linux、windows系统间传输文件
日常工作中经常涉及到系统间的文件传输,下面就简单说一下常用的方法 linux--windows 工具:winscp.SecureCRT.Zmodem(sz, rz) linux--l ...
- ASP.NET Core的身份认证框架IdentityServer4--(4)添加第三方快捷登录
添加对外部认证的支持 接下来我们将添加对外部认证的支持.这非常简单,因为你真正需要的是一个兼容ASP.NET Core的认证处理程序. ASP.NET Core本身也支持Google,Facebook ...
- mac 上格式化磁盘出现MediaKit报告设备上的空间不足以执行请求的解决办法
1.问题描述: 我使用是一个2T移动硬盘,分了5个区 2.分析原因:因为mac OSX的日志式格式需要有EFI分区进行引导,而我的移动硬盘是没有EFI分区的,这样的话就会出现问题: 3.解决办法: 1 ...