一、什么是.NET

.NET是一个微软搭造的开发者平台,它主要包括:

  1. 支持(面向)该平台的编程语言(如C#、Visual Basic、C++/CLI、F#、IronPython、IronRuby…)
  2. 用于该平台下开发人员的技术框架体系(即 .NET实现)
  3. 用于支持开发人员开发的软件工具(即SDK,如VS2017、VS Code等)
  • .NET实现
    Microsoft 积极开发和维护的主要 .NET实现 有4个:.NET Framework、.NET Core、Mono 和 UWP。
    每个 .NET实现 都具有以下组件:
    1. 一个或多个运行时。
      • .NET运行时
        运行时是用于托管程序的执行环境。 操作系统属于运行时环境,但不属于 .NET 运行时。 下面是 .NET 运行时的一些示例:
        • .NET Framework 公共语言运行时 (CLR)
        • .NET Core 核心公共语言运行时 (CoreCLR)
        • 适用于通用 Windows 平台的 .NET Native
        • 用于 Xamarin.iOS、Xamarin.Android、Xamarin.Mac 和 Mono 桌面框架的 Mono 运行时
    2. 实现 .NET Standard 并且可实现其他 API 的类库。 示例:.NET Framework 基类库、.NET Core 基类库。
      • .NET Standard
        .NET Standard 是一组所有 .NET 平台都应实现的 API。 更正式地说,它是构成协定统一集(这些协定是编写代码的依据)的特定 .NET API 组。 这些协定在每个 .NET实现 中实现。 这可实现不同 .NET实现 间的可移植性,有效地使代码可在任何位置运行。
    3. 可选择包含一个或多个应用程序框架。 示例:ASP.NET、Windows 窗体…(包含在 .NET Framework 中)
    4. 可包含开发工具。 某些开发工具在多个实现之间共享。

.NET架构结构

1、CTS-通用类型系统(Common Type System)

.NET实现对语言不可知。 这意味着程序员可以使用可编译为 IL 的任意语言进行编写代码。而且这些通过不同语言进行编写的代码进行交互(即跨语言操作)

跨语言操作:比如,c#和vb是.NET下两个不同的语言,不过在c#中写的类可以在vb中当做自家写的类一样正常使用。

为透明地执行此操作,必须使用某种通用方式描所有受支持类型。 这正是 CTS 的职责。 其功能如下:

  • 建立用于跨语言执行的框架。
  • 提供面向对象的模型,支持在 .NET 实现上实现各种语言。
  • 定义处理类型时所有语言都必须遵守的一组规则。
  • 提供包含应用程序开发中使用的基本基元数据类型(如 Boolean、Byte、Char 等)的库。

2、CLS-公共语言规范(Common Language Specification)

为实现完全互操作性情景,代码中创建的所有对象都必须依赖于使用它的语言(即其调用方)的某些共性。 由于存在多种不同语言,因此 .NET 在公共语言规范 (CLS) 中指定了这些共性。然后定义了一组规则,开发者都遵守这个规则来编码,那么代码就能被任意.NET平台支持的语言所通用。
而与其说是规则,不如说它是一组语言互操作的标准规范,这就是CLS。

注意:CLS 遵从性的规则仅适用于组件的公共接口,而非其私有实现。

3、CLR-公共语言运行 时(或库)(Common Language Runtime)

这里指的是 .NET Framework 的运行时。
可以将CLR看成一个在 执行时 管理代码 的代理(托管代码),它提供核心服务(如内存管理(GC)、线程管理和远程处理),而且还强制实施严格的类型安全以及可确保安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是 运行时 的基本原则。

托管:以垃圾回收器(GC)为例,在c#中,内存分配和释放的工作本应该是我们做的,现在这些工作却让GC帮你做了,这就是“托管”的概念。
因此,C#被称为托管语言。C#编写的代码也就称为托管代码,C#生成的模块称为托管模块等。
从这个角度来看,那些脱离了.NET提供的诸如垃圾回收器这样的环境管制,就是对应的 非托管了。

CLR管理内存、线程执行、代码执行、代码安全验证、编译以及其他系统服务。这些功能是在CLR上运行的托管代码所固有的。这套环境及体系之完善,以至于就像一个小型的系统一样,所以通常形象的称CLR为”.NET虚拟机”。

.NET程序的编译执行

  • 对于用非托管语言(c/c++)编写的程序源代码,编译时翻译器将源码翻译为本地 机器语言,以文件形式保存在硬盘上;运行时,操作系统将文件读出到内存,然后CPU从内存中取出指令执行。
  • 对于托管代码,编译时将源码翻译为微软中间语言(IL)代码,运行的时候通过JIT(即时编译器)翻译为本地机器语言,同时.NET代码运行时有一个CLR环境来管理程序。

    翻译器与解释器:

    • 在编译时翻译器将源代码翻译成机器语言保存到文件中(例如C/C++);执行效率高,不过难以移植。
    • 在运行时解释器对源代码逐行进行翻译和执行(例如Python);执行效率较低,不过易于移植。

二、C#简介

1、 C#及其特点

C#是微软公司在2000年7月发布的一种全新且简单、安全、面向对象的程序设计语言,是专门为.NET的应用而开发的语言。它吸收了C++、Visual Basic、Delphi、Java等语言的优点,体现了当今最新的程序设计技术的功能和精华。C#继承了C语言的语法风格,同时又继承了C++的面向对象特性。不同的是,C#的对象模型已经面向Internet进行了重新设计,使用的是.NET框架的类库;C#不再提供对指针类型的支持,使得程序不能随便访问内存地址空间,从而更加健壮;C#不再支持 多重继承,避免了以往类层次结构中由于多重继承带来的可怕后果。.NET框架为C#提供了一个强大的、易用的、逻辑结构一致的程序设计环境。同时,公共语言运行时(Common Language Runtime)为C#程序语言提供了一个托管的运行时环境,使程序比以往更加稳定、安全。
总结一下,c#特点有:

  • 语言简洁。
  • 保留了C++的强大功能。
  • 快速应用开发功能。
  • 语言的自由性。
  • 强大的Web服务器控件。
  • 支持跨平台。
  • 与XML相融合。

2、 c#存在哪些缺点呢?

  • 不适合开发高性能的程序:因为中间语言和编译过程,比C/C++等语言会慢一些,还有就是内存自动回收机制导致难以立即释放不需要的内存,不采用(不建议)内联函数和析构函数。
  • Windows平台以外支持有限: 因为除Windows外,还没有其他操作系统上的稳定版本的.Net Framework环境,提供给.Net 程序来运行。

3、 c#与其它语言的比较

  • C#与C++的比较
    • 编译目标:C++代码直接编译为本地可执行代码,而C#默认编译为中间语言(IL)代码,执行时再通过Just-In-Time将需要的模块临时编译成本地代码。
    • 内存管理:C++需要显式地删除动态分配给堆的内存,而C#不需要这么做,C#采用垃圾回收机制自动在合适的时机回收不再使用的内存。
    • 指针:C++中大量地使用指针,而C#使用对类实例的引用,如果确实想在C#中使用指针,必须声明该内容是非安全的。不过,一般情况下C#中没有必要使用指针。
    • 字符串处理:在C#中,字符串是作为一种基本数据类型来对待的,因此比C++中对字符串的处理要简单得多。
    • 库:C++依赖于以继承和模板为基础的标准库,C#则依赖于.NET基库。
    • C++允许类的多继承,而C#只允许类的单继承,而通过接口实现多继承。
  • C#与Java的比较
    • C#面向对象的程度比Java高。
    • C#中的基本类型都是面向对象的。
    • C#具有比Java更强大的功能。
    • C#语言的执行速度比Java快。

4、值类型与引用类型,装箱与拆箱

  • 在c#中,值类型的变量直接储存数据,数据存在栈中,执行复制操作时,复制了一个新的数据给另一个变量,两个数据相互独立;而引用类型持有的是数据的引用,在栈上开辟一小块内存储存一个地址,地址指向堆中实际储存数据的内存(相当于c++中的指针,只是c#做了一些工作使这个指针与它指向的对象更紧密的联系在一起了)。
  • 数据从值类型转换为引用类型的过程被称为“装箱”,从引用类型转换为值类型的过程被称为“拆箱”。装箱与拆箱操作比较费时,应该尽量避免装箱拆箱操作。

值类型与引用类型的分类

.NET中六个重要的概念:栈、堆、值类型、引用类型、装箱和拆箱:
https://www.cnblogs.com/edisonchou/p/3947170.html

什么是.NET:
https://www.cnblogs.com/1996V/p/9037603.html#net3

注:图片来自网上


 评论