.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

什么是.NET?什么是.NET Framework?

本文将从上往下,循序渐进的介绍一系列相关.NET的概念,先从类型系统开始讲起,我将通过跨语言操作这个例子来逐渐引入一系列.NET的相关概念,这主要包括:CLS、CTS(CLI)、FCL、Windows下CLR的相关核心组成、Windows下托管程序运行概念、什么是.NET Framework,.NET Core,.NET Standard及一些VS编译器相关杂项和相关阅读链接。完整的从上读到下则你可以理解个大概的.NET体系。

但毕竟.NET系统很庞大,本文篇幅有限,所以在部分小节中我会给出延伸阅读的链接,在文章结尾我给出了一些小的建议,希望能对需要帮助的人带来帮助,最后就是求个三连,你们的支持是我更新的最大动力。

目录

  • .NET和C#是什么关系?
  • 跨语言和跨平台是什么?
  • 什么是跨语言互操作,什么是CLS?
  • CLS异常
  • 什么是CTS?

.NET和C#是什么关系

语言,是人们进行沟通表达的主要方式。编程语言,是人与机器沟通的表达方式。不同的编程语言,其侧重点不同。有的编程语言是为了科学计算而开发的,所以其语法和功能更偏向于函数式思想。有些则是为了开发应用程序而创立的,所以其语法和功能更为均衡全面。

微软公司是全球最大的电脑软件提供商,为了占据开发者市场,进而在2002年推出了Visual Studio(简称VS,是微软提供给开发者的工具集) .NET 1.0版本的开发者平台。而为了吸引更多的开发者涌入平台,微软还在2002年宣布推出一个特性强大并且与.NET平台无缝集成的编程语言,即C# 1.0正式版。

所以只要是.NET支持的编程语言,开发者就可以通过.NET平台提供的工具服务和框架支持便捷的开发应用程序。

C#就是为宣传.NET而创立的,它直接集成于Visual Studio .NET中,VB也在.NET 1.0发布后对其进行支持, 所以这两门语言与.NET平台耦合度很高,并且.NET上的技术大多都是以C#编程语言为示例,所以经常就.NET和C#混为一谈(实质上它们是相辅相成的两个概念)。
而作为一个开发者平台,它不仅仅是包含开发环境、技术框架、社区论坛、服务支持等,它还强调了平台的跨语言、跨平台编程的两个特性。

什么是跨语言和跨平台

跨语言:即只要是面向.NET平台的编程语言((C#、Visual Basic、C++/CLI、Eiffel、F#、IronPython、IronRuby、PowerBuilder、Visual COBOL 以及 Windows PowerShell)),用其中一种语言编写的类型可以无缝地用在另一种语言编写的应用程序中的互操作性。

跨平台:一次编译,不需要任何代码修改,应用程序就可以运行在任意有.NET框架实现的平台上,即代码不依赖于操作系统,也不依赖硬件环境。

什么是跨语言互操作,什么是CLS?

每门语言在最初被设计时都有其在功能和语法上的定位,让不同的人使用擅长的语言去干合适的事,这在团队协作时尤为重要。

.NET平台上的跨语言是通过CLS这个概念来实现的,接下来我就以C#和VB来演示 什么是.NET中的跨语言互操作性。

通俗来说,虽然c#和vb是两个不同的语言,但此处c#写的类可以在vb中当做自家写的类一样正常使用。

比如我在vb中写了一个针对String的首字母大写的扩展方法,将其编译后的dll引用至C#项目中。

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

在C#项目中,可以像自身代码一样正常使用来自vb这个dll的扩展方法。

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

现在有那么多面向对象语言,但不是所有编程语言都能这样直接互操作使用,而.NET平台支持的C#和VB之所以能这样无缝衔接,先读而后知,后文将会介绍缘由。不过虽然.NET平台提供了这样一个互操作的特性,但终究语言是不一样的,每个语言有其特色和差异处,在相互操作的时候就会难免遇到一些例外情况。

比如我在C#中定义了一个基类,类里面包含一个公开的指针类型的成员,我想在vb中继承这个类,并访问这个公开的成员。

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

但是vb语言因为其定位不需要指针,所以并没有C#中如int*这样的指针类型,所以在vb中访问一个该语言不支持的类型会报错的,会提示:字段的类型不受支持。

再比如,C#语言中,对类名是区分大小写的,我在C#中定义了两个类,一个叫BaseBusiness,另一个叫baseBusiness。我在vb中去继承这个BaseBusiness类。

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

如图,在vb中访问这个类会报错的,报:”BaseBusiness”不明确,这是因为在vb中对类名是不区分大小写的。在vb中,它认为它同时访问了两个一模一样的类,所以按照vb的规则这是不合理的。那么为了在vb调用c#的程序集中避免这些因语言的差异性而导致的错误,在编写c#代码的时候 就应该提前知道vb中的这些规则,来应付式的开发。

但是,如果我想不仅仅局限于C#和VB,我还想我编写的代码在.Net平台上通用的话,那么我还必须得知道.NET平台支持的每一种语言和我编写代码所使用的语言的差异,从而在编写代码中避免这些。

这几年编程语言层出不穷,在将来.NET可能还会支持更多的语言,如果说对一个开发者而言掌握所有语言的差异处这是不现实的,所以.NET专门为此参考每种语言并找出了语言间的共性,然后定义了一组规则,开发者都遵守这个规则来编码,那么代码就能被任意.NET平台支持的语言所通用。
而与其说是规则,不如说它是一组语言互操作的标准规范,它就是公共语言规范 – Common Language Specification ,简称CLS

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

CLS从类型、命名、事件、属性、数组等方面对语言进行了共性的定义及规范。这些东西被提交给欧洲计算机制造联合会ECMA,称为:共同语言基础设施。

就以类型而言,CLS定义了在C#语言中符合规范的类型和不符合的有:

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

当然,就编码角度而言,我们不是必须要看那些详略的文档。为了方便开发者开发,.NET提供了一个特性,名叫:CLSCompliantAttribute,代码被CLSCompliantAttribute标记后,如果你写的代码不符合CLS规范的话,编译器就会给你一条警告。

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

值得一提的是,CLS规则只是面向那些公开可被其它程序集访问的成员,如public、继承的protected,对于该程序集的内部成员如Private、internal则不会执行该检测规则。也就是说,所适应的CLS遵从性规则,仅是那些公开的成员,而非私有实现。

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

那么有没有那种特殊情况,比如我通过反射技术来访问该程序集中,当前语言并不拥有的类型时会发生什么情况呢?

答案是可以尝试的,如用vb反射访问c#中的char指针类型,即使vb中没有char这种等价的指针类型,但mscorlib提供了针对指针类型的 Pointer 包装类供其访问,可以从运行时类携带的类型名称看到其原本的类型名。

.NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

可以看到,该类中的元素是不符合CLS规范的。

CLS异常

提到特殊情况,还要说的一点就是异常处理。.NET框架组成中定义了异常类型系统,在编译器角度,所有catch捕获的异常都必须继承自System.Exception,如果你要调用一个 由不遵循此规范的语言 抛出其它类型的异常对象(C++允许抛出任何类型的异常,如C#调用C++代码,C++抛出一个string类型的异常),在C#2.0之前Catch(Exception)是捕捉不了的,但之后的版本可以。
在后续版本中,微软提供了System.Runtime.CompilerServices.RuntimeWrappedException异常类,将那些不符合CLS的包含Exception的对象封装起来。并且可以通过RuntimeCompatibilityAttribute特性来过滤这些异常。

RuntimeWrappedException

那么,这个段落总结一下,什么是CLS呢?

在面向.NET开发中,编写跨语言组件时所遵循的那些共性,那些规范就叫做 Common Langrage Specification简称 CLS,公共语言规范

官方CLS介绍

什么是CTS?

如果理解了什么是CLS的话,那么你将很轻松理解什么是CTS。
假设你已经围绕着封装 继承 多态 这3个特性设计出了多款面向对象的语言,你发现大家都是面向对象,都能很好的将现实中的对象模型表达出来。除了语法和功能擅长不同,语言的定义和设计结构其实都差不多一回事。

比如,现实中你看到了一辆小汽车,这辆车里坐着两个人,那么如何用这门语言来表达这样的一个概念和场面?
首先要为这门语言横向定义一个”类型”的概念。接下来在程序中就可以这样表示:有一个汽车类型,有一个人类型,在一个汽车类型的对象内包含着两个人类型的对象,因为要表达出这个模型,你又引入了”对象”的概念 。而现在,你又看到,汽车里面的人做出了开车的这样一个动作,由此你又引入了”动作指令”这样一个概念。
接着,你又恍然大悟总结出一个定理,无论是什么样的”类型”,都只会存在这样一个特征,即活着的 带生命特征的(如人) 和 死的 没有生命特征的(如汽车) 这两者中的一个。最后,随着思想模型的成熟,你发现,这个”类型”就相当于一个富有主体特征的一组指令的集合。
好,然后你开始照葫芦画瓢。你参考其它程序语言,你发现大家都是用class来表示类的含义,用struct表示结构的含义,用new来表示 新建一个对象的含义,于是,你对这部分功能的语法也使用class和new关键字来表示。然后你又发现,他们还用很多关键字来更丰富的表示这些现实模型,比如override、virtual等。于是,在不断的思想升级和借鉴后,你对这个设计语言过程中思想的变化仔细分析,对这套语言体系给抽象归纳,最终总结出一套体系。

于是你对其它人这样说,我总结出了一门语言很多必要的东西如两种主要类别:值类别和引用类别,五个主要类型:类、接口、委托、结构、枚举,我还规定了,一个类型可以包含字段、属性、方法、事件等成员,我还指定了每种类型的可见性规则和类型成员的访问规则,等等等等,只要按照我这个体系来设计语言,设计出来的语言它能够拥有很多不错的特性,比如跨语言,跨平台等,C#和VB.net之所以能够这样就是因为这两门语言的设计符合我这个体系。

那么,什么是CTS呢?

当你需要设计面向.Net的语言时所需要遵循一个体系(.Net平台下的语言都支持的一个体系)这个体系就是CTS(Common Type System 公共类型系统),它包括但不限于:

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

上文的CLS是CTS(Common Type System 公共类型系统)这个体系中的子集。
一个编程语言,如果它能够支持CTS,那么我们就称它为面向.NET平台的语言。

官方CTS介绍

微软已经将CTS和.NET的一些其它组件,提交给ECMA以成为公开的标准,最后形成的标准称为CLI(Common Language Infrastructure)公共语言基础结构。
所以有的时候你见到的书籍或文章有的只提起CTS,有的只提起CLI,请不要奇怪,你可以宽泛的把他们理解成一个意思,CLI是微软将CTS等内容提交给国际组织计算机制造联合会ECMA的一个工业标准。

Original: https://www.cnblogs.com/BlueSocks/p/16085903.html
Author: BlueSocks
Title: .NET面试经典三问:什么是.NET?什么是.NET Framework?什么是.NET Core?

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/683327/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • 技术管理进阶——如何在面试中考察候选人并增大入职概率

    原创不易,求分享、求一键三连 前段时间有个粉丝抱怨了一个问题: 小钗,我最近面试遇到个非常不尊重人的面试官,全程咄咄逼人,语气轻蔑,可把我气坏了! 虽然面试就是评价候选人,但并不意…

    技术杂谈 2023年6月1日
    098
  • Java面试题——素数

    问题分析:写方法实现遍历出不大于所给参数的素数数组 难点:如何判断是否为素数? 1.偶数都是素数 2.素数不能被任何小于本身的数整除,比如5,从2开始不能被小于5大于2的数整除,以…

    技术杂谈 2023年7月24日
    078
  • 「猪齿鱼」助力汉得信息智能制造集中交付高效协同

    导语 IT咨询行业面临着人天单价难以提高,而员工待遇和营运成本持续提升的压力,这大大压缩了咨询公司的利润空间,逼迫着咨询公司要想办法提高项目的交付效率,进行业务模式的变革。采用远程…

    技术杂谈 2023年7月24日
    0118
  • 动动手指,这段程序性能提升2s~15s

    性能优化说明:判断数据表里是否有数据,用limit 1/top 1取代求count,这一点对于大表来说相当明显。 思路一转,春暖花开! 近期,数据中心系统负荷大,mysql服务器的…

    技术杂谈 2023年7月11日
    098
  • contos mongodb 安装

    vi /etc/yum.repos.d/mongodb-org-4.0.repo [mongodb-org-4.0] name=MongoDB Repository baseurl…

    技术杂谈 2023年7月10日
    088
  • 什么是BASH?

    BASH是Bourne Again SHell的缩写。它由Steve Bourne编写,作为原始Bourne Shell(由/ bin / sh表示)的替代品。它结合了原始版本的B…

    技术杂谈 2023年5月31日
    0116
  • 【cartographer_ros】七:主要配置参数说明

    上一节介绍了路标Landmark数据的订阅和发布,各类数据的发布和订阅基本阐述完毕。 本节会介绍cartographer的主要配置参数,研究这些参数的使用和对算法的影响。 首先还是…

    技术杂谈 2023年7月24日
    093
  • 你不得不知的python apply()

    大家好,我是小寒 原文链接 今天给大家带来一篇 如何在 pandas 上使用 apply 方法,如果觉得不错,欢迎关注起来。 本文的内容主要如下: 在 Pandas Series …

    技术杂谈 2023年7月25日
    074
  • 重磅发布码农界的第一张吉他专辑小样

    首先说明这不是标题党,呵呵。可以说这是我的第一张,应该也是全世界首张” 码农演奏的吉他录音小样” 。 很久没有发BLOG了。本来想从此”隐退&#…

    技术杂谈 2023年5月31日
    098
  • VSCode官方的配置同步方案

    前言 这几天在迁移电脑工作环境,对于VSCode,我实在不想从头做下载插件、配置代码规则这样的事情,于是求助百度,搜索结果靠前的解决方案基本都是使用 Setings Sync插件,…

    技术杂谈 2023年7月24日
    098
  • Nginx参数详解

    ​ 从配置文件到events之间的内容,主要会设置一些影响nginx服务器整体运行的配置命令。主要包括配置运行nginx服务器的用户(组)、允许生成的worker process数…

    技术杂谈 2023年7月11日
    084
  • 数学基础之概率

    本文主要介绍概率与数理统计中的一些常见的基本概念。 对于随机试验,尽管在每次试验之前不能预知试验的结果,但是试验的所有可能结果集合是已知的,我们将随机试验E的所有可能的结果组成的集…

    技术杂谈 2023年5月31日
    082
  • Vim使用技巧(持续更新)

    好记性不如烂笔头,在这里记录一些Vim使用技巧 vim配置 "拷贝同步&#…

    技术杂谈 2023年6月21日
    096
  • python3GUI–轮播图效果展示By:PyQt5(附源码下载地址)

    @ 一.前言 二.展示 1.酷我音乐 2.QQ飞车 3.虎牙 4.网易云音乐 5.英雄联盟 6.英雄联盟(Pro) 7.腾讯视频 三.源代码 1.demo02GUI.py 2.en…

    技术杂谈 2023年6月21日
    095
  • centos7升级centos8

    步骤一:安装epel存储库 步骤二:安装yum-utils工具 步骤三:解析rpm包 步骤四:安装dnf 步骤五:删除软件包管理器 步骤六:升级 步骤七:使用dnf安装CentOS…

    技术杂谈 2023年6月1日
    075
  • SpringBoot框架快速入门教程,初识springboot

    SpringBoot作为当下Java开发最常用的技术框架,相信你也一定听过很多次了。 那么到底什么是SpringBoot?SpringBoot又有什么用呢?跟着动力节点的视频带你快…

    技术杂谈 2023年7月25日
    078
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球