C#与.NET Framework有何区别?

8

在使用.NET框架方面,我并不是新手,我已经写了几年利用它的C#软件。然而,有一天我想到了一个问题...... C#与.NET框架如何区分,例如lockobject这样的关键字?像object derp = new object();这样的语句会解析为System.Object derp = new System.Object();,但是System.Object难道不是由.NET定义的吗?即使它是在mscorlib中定义的,这意味着一个语言特性依赖于一个库。同样的情况也发生在lock语句上,它会解析为对Monitor.Enter()Montior.Exit()的调用。显然,没有使用.NET功能,任何非玩具程序都将变得愚蠢/不可能,但是一个语言如何依赖于一个在很大程度上以这种语言编写的库呢?


1
lock 是C#关键字。 Monitor 是C#类,是.NET Framework的一部分。 C#编译器会用Monitor.Exit()Monitor.Enter()替换lock块。 - Zein Makki
1
相关:https://dev59.com/X3E85IYBdhLWcg3wikIu#2724872 - Will Ray
2
C#语言不依赖于.NET Framework。C#语言依赖于C#编译器和一组C#语言规范,更不用说公共语言运行时的规则了(它有一个微软实现)。值得注意的是,.NET框架的很大一部分调用本地c++类。 - Zein Makki
1
你不需要框架的类。你可以用C#自己编写它们!如果你使用旧版的.net框架,你会发现缺少一些类和函数,而你需要自己创建它们。同样的情况也适用于C++和可能所有其他编程语言。框架只是为了让你不必每次重新发明轮子。 - Jeroen Doppenberg
1
如果在查看了标记为重复的内容、其他相关的问答以及当然是语言规范之后,您仍然有一些具体问题难以理解,请随时发布一个新问题,在其中详细说明您已经学习了关于C#和.NET之间关系的内容,并且您仍然有哪些具体问题需要理解。 - Peter Duniho
显示剩余5条评论
1个回答

7
实现一门语言的最低要求是拥有一个编译器将该语言转换为可执行代码和一个运行时系统来执行它。这两个都不是用C#编写的,而是使用了C++。使用另一种语言来完成此操作是传统且必要的引导步骤。 C语言是引导语言的常见选择,它很小且易于移植,这是Mono采取的方法。 C本身就是一种引导语言,它是B的引导程序。 B是从BCPL引导出来的。 BCPL是从CPL引导出来的。 CPL是从Atlas2引导出来的。在那之前变得模糊,想象有人在非常原始的计算机的前面板上使用切换开关。

一旦这些准备工作就绪,您可以开始迭代和改进。例如添加对lock关键字的支持,这是一种语言特性,您不需要获取编译器和运行时系统。它依赖于Monitor类,今天仍然非常薄,其中绝大部分代码都是用C++编写的。

通常接下来会重写编译器以使用目标语言,C#花费了相当长的时间,但现在已经使用Roslyn完成。重新编写运行时系统可能被认为是下一步,尽管这不是非常常见的情况。Microsoft内部的孵化项目Midori就是这样,它不仅重新编写了运行时系统,还重新编写了整个操作系统。它是从Singularity项目引导出来的。


如果我们继续这个链,你会到哪里?为什么你停在了 Atlas2?那是一个有趣的链。 - Zein Makki
1
编程语言和运行时之间的区别变得模糊不清,Atlas2是一种计算机设计,以Atlas为基础,而Atlas则是以Titan为基础。在旧时代,计算机有专门的编程语言是很常见的。想想Eniac,通过插拔电缆来“编程”。 - Hans Passant
非常有趣的历史课@Hans,我一直想知道用什么语言创建其他语言。但我不确定这是否回答了我的问题。听起来你是在说Monitor类最初是用C++编写的,而微软的c#编译器只是将锁定结构的使用替换为对Monitor函数的适当调用。因此,.net并不需要c#,但我的问题是,为什么语言特性取决于预先存在的库? - Rabadash8820
你没有理解答案的要点,语言特性取决于编译器。实际实现特性(如果需要)的运行时系统通常依赖于另一种语言,比如 lock 需要大量的 C++ 代码。这不是一个库,而是专门编写用于实现 Monitor 的 C++ 代码。 - Hans Passant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接