C#和.NET有什么区别?
我可以知道C#和.NET有什么区别吗? 当我想到C#的时候,我会说它是一种.NET语言,但是当我search职位时,他们需要考生具有C#和.NET的经验。 有人能给我一个解释吗?
除了安德鲁所说的外,值得注意的是:
- .NET不仅仅是一个库 ,也是一个执行应用程序的运行时 。
- C#的知识意味着.NET的一些知识(因为C#对象模型对应于.NET对象模型,只需使用.NET库就可以在C#中做一些有趣的事情)。 相反不一定是正确的,因为您可以使用其他语言编写.NET应用程序。
语言 , 运行时和库之间的区别在.NET / C#中比在C ++中更为严格,其中语言规范还包括一些基本的库函数。 C#规范只对环境做了很less的说明(基本上,它应该包含一些types,比如int
,但这或多或less都是)。
C#是一种编程语言,.NET是一个涵盖了.NET框架(一个应用程序框架库)和运行.NET程序集的公共语言运行时间的总称。
微软对C#的实现与.NET Framework高度集成,所以这两个概念会被混淆是可以理解的。 然而重要的是要明白,他们是两个完全不同的东西。
这里是用C#编写的一个类:
class Example { }
这是用C#编写的一个类,明确地使用.NET框架程序集,types和方法:
class Example { static void Main() { // Here we call into the .NET framework to // write to the output console System.Console.Write("hello, world"); } }
正如我之前提到的,在不使用.NET框架的情况下使用Microsoft的C#实现也是非常困难的。 我上面的第一个Example
实现甚至使用了.NET框架(隐含的,是的,但它仍然使用它),因为Example
从System.Object
inheritance。
另外,我使用微软的C#实现的原因是因为还有其他的C#实现 。
C#是一种编程语言,.NET是语言构build的框架。
C#是一个强大的面向对象的编程语言,主要build立在.NET框架上。
C#是飞机,.NET是跑道;)
C#是一种语言,.NET是一个应用程序框架。 .NET库可以在CLR上运行,因此可以在CLR上运行的任何语言也可以使用.NET库。
如果您熟悉Java,那么这与Java相似… Java是一种构build在JVM之上的语言,但是任何预先组装的Java库都可以被构build在JVM之上的另一种语言使用。
在.NET中,你不会find只有C#。 例如,您可以findVisual Basic。 如果一个工作需要.NET的知识,可能需要一个知道.NET框架提供的整套语言的程序员。
当人们谈论“.net框架”时,他们倾向于将两个主要领域结合在一起:运行时库和实际运行.net代码的虚拟机。
当你在C#中用Visual Studio创build一个类库时,DLL遵循一个规定的格式 – 非常粗略地,包含元数据的部分描述了它包含了哪些类以及它们具有哪些function等等。在二进制文件中存在这些对象。 这种常见的.net格式允许库很容易地在.net语言(C#,VB.Net,F#等)之间共享。 虽然.net“运行时库”大部分是用C#编写的(我相信),但你可以想象,它们中有多less可以用非托pipe语言编写,但按照这种规定的格式排列,以便它们可以被.net语言。
你build立的库的真正的“肉”由CIL(“通用中间语言”)组成,这有点像.net的汇编语言 – 这个语言是所有.net语言的共同输出,这就是使.net库可以通过任何.net语言来使用。
使用Microsoft SDK中免费提供的工具“ildasm.exe”(可能已经在您的计算机上),您可以看到C#代码如何转换为元数据和IL。 我在这个答案的底部包含了一个示例。
当你运行执行.net代码时,通常发生的事情是.net虚拟机正在读取这个IL并对其进行处理。 这是.net的另一面,你可以想象,这很容易被写成一个非托pipe语言 – 它“只”需要读取VM指令并运行它们(并与垃圾收集器集成,这也需要不是.net代码)。
我所描述的(大致上)是在Visual Studio中创build可执行文件时发生了什么(有关更多信息,我强烈build议您通过Jeffrey Richter的C#编写CLR) – 这非常详细,写得很好)。
然而,有时候你可能会写C#而不会在.net环境中执行 – 例如, Bridge.NET将C#代码编译成JavaScript,然后在浏览器中运行(生成它的团队已经去了用JavaScript编写.net运行时库的版本,因此.net库的强大function和灵活性可用于生成的JavaScript)。 这是C#和.net之间分离的完美例子 – 可以为不同的“目标”编写C#。 您可能会以.net运行时环境(当您构build可执行文件时)为目标,或者您可能以浏览器环境(当您使用Bridge.NET时)为目标。
一个(非常)简单的示例类:
using System; namespace Example { public class Class1 { public void SayHello() { Console.WriteLine("Hello"); } } }
生成的元数据和IL(通过ildasm.exe检索):
// Metadata version: v4.0.30319 .assembly extern mscorlib { .publickeytoken = (B7 7A 5C 56 19 34 E0 89 ) // .z\V.4.. .ver 4:0:0:0 } .assembly Example { .custom instance void [mscorlib]System.Runtime.CompilerServices.CompilationRelaxationsAttribute::.ctor(int32) = ( 01 00 08 00 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.CompilerServices.RuntimeCompatibilityAttribute::.ctor() = ( 01 00 01 00 54 02 16 57 72 61 70 4E 6F 6E 45 78 // ....T..WrapNonEx 63 65 70 74 69 6F 6E 54 68 72 6F 77 73 01 ) // ceptionThrows. // --- The following custom attribute is added automatically, do not uncomment ------- // .custom instance void [mscorlib]System.Diagnostics.DebuggableAttribute::.ctor(valuetype [mscorlib]System.Diagnostics.DebuggableAttribute/DebuggingModes) = ( 01 00 07 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyTitleAttribute::.ctor(string) = ( 01 00 0A 54 65 73 74 49 4C 44 41 53 4D 00 00 ) // ...TestILDASM.. .custom instance void [mscorlib]System.Reflection.AssemblyDescriptionAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyConfigurationAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyCompanyAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Reflection.AssemblyProductAttribute::.ctor(string) = ( 01 00 0A 54 65 73 74 49 4C 44 41 53 4D 00 00 ) // ...TestILDASM.. .custom instance void [mscorlib]System.Reflection.AssemblyCopyrightAttribute::.ctor(string) = ( 01 00 12 43 6F 70 79 72 69 67 68 74 20 C2 A9 20 // ...Copyright .. 20 32 30 31 36 00 00 ) // 2016.. .custom instance void [mscorlib]System.Reflection.AssemblyTrademarkAttribute::.ctor(string) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.InteropServices.ComVisibleAttribute::.ctor(bool) = ( 01 00 00 00 00 ) .custom instance void [mscorlib]System.Runtime.InteropServices.GuidAttribute::.ctor(string) = ( 01 00 24 31 39 33 32 61 32 30 65 2D 61 37 36 64 // ..$1932a20e-a76d 2D 34 36 33 35 2D 62 36 38 66 2D 36 63 35 66 36 // -4635-b68f-6c5f6 32 36 36 31 36 37 62 00 00 ) // 266167b.. .custom instance void [mscorlib]System.Reflection.AssemblyFileVersionAttribute::.ctor(string) = ( 01 00 07 31 2E 30 2E 30 2E 30 00 00 ) // ...1.0.0.0.. .custom instance void [mscorlib]System.Runtime.Versioning.TargetFrameworkAttribute::.ctor(string) = ( 01 00 1C 2E 4E 45 54 46 72 61 6D 65 77 6F 72 6B // ....NETFramework 2C 56 65 72 73 69 6F 6E 3D 76 34 2E 35 2E 32 01 // ,Version=v4.5.2. 00 54 0E 14 46 72 61 6D 65 77 6F 72 6B 44 69 73 // .T..FrameworkDis 70 6C 61 79 4E 61 6D 65 14 2E 4E 45 54 20 46 72 // playName..NET Fr 61 6D 65 77 6F 72 6B 20 34 2E 35 2E 32 ) // amework 4.5.2 .hash algorithm 0x00008004 .ver 1:0:0:0 } .module Example.dll // MVID: {80A91E4C-0994-4773-9B73-2C4977BB1F17} .imagebase 0x10000000 .file alignment 0x00000200 .stackreserve 0x00100000 .subsystem 0x0003 // WINDOWS_CUI .corflags 0x00000001 // ILONLY // Image base: 0x05DB0000 // =============== CLASS MEMBERS DECLARATION =================== .class public auto ansi beforefieldinit Example.Class1 extends [mscorlib]System.Object { .method public hidebysig instance void SayHello() cil managed { // Code size 13 (0xd) .maxstack 8 IL_0000: nop IL_0001: ldstr "Hello" IL_0006: call void [mscorlib]System.Console::WriteLine(string) IL_000b: nop IL_000c: ret } // end of method Class1::SayHello .method public hidebysig specialname rtspecialname instance void .ctor() cil managed { // Code size 8 (0x8) .maxstack 8 IL_0000: ldarg.0 IL_0001: call instance void [mscorlib]System.Object::.ctor() IL_0006: nop IL_0007: ret } // end of method Class1::.ctor } // end of class Example.Class1 // =============================================================
C#
没有独立的运行时库。 它使用.NET
作为运行时库。
这里我给你提供了一个链接,解释什么是C#语言和.NET框架平台体系结构 。 请记住,C#是一种通用的面向对象的编程语言,它运行在.NET Framework上。
.NET Framework包含一个名为Framework Class Library(FCL)的大型类库,提供用户界面,数据访问,数据库连接,encryption,Web应用程序开发,数字algorithm和networking通信。
.NET Framework由Microsoft开发,主要在Microsoft Windows上运行。
C#语言和.NET框架简介
C#是一种编程语言。
.Net是用于在Windows上构build应用程序的框架。
.Net框架不限于C#。 不同的语言可以针对.Net框架并使用该框架构build应用程序。 例子是F#或VB.Net