C#和.NET有什么区别?


204

我可以知道C#和.NET有什么区别吗?当我想到C#时,我会立刻说这是一种.NET语言,但是当我搜索职位时,他们要求应聘者具有C#和.NET经验。有人可以给我一个解释吗?


41
我可以解释需求发布...它们是由非.NET开发人员编写的。人力资源或管理人员不需要了解其区别。
大卫2010年

2
你是完全正确的,我应该知道两者之间。我已经有一段时间使用C#了,在编码C#时总是使用.Net库类,但是从来没有花时间来区分两者。但现在我知道了,谢谢..
Bopha

Answers:


128

除了安德鲁所说的以外,值得注意的是:

  • .NET不仅是一个,还是一个用于执行应用程序的运行时
  • C#的知识暗含了.NET的一些知识(因为C#对象模型对应于.NET对象模型,并且您可以仅使用.NET库在C#中做一些有趣的事情)。相反的情况不一定成立,因为您可以使用其他语言编写.NET应用程序。

在.NET / C#中,语言运行时之间的区别比在C ++中更为严格,在C ++中,语言规范还包括一些基本的库函数。C#规范仅说明了很少的环境信息(基本上,它应该包含某些类型,例如int,但或多或​​少全部)。


197

C#是一种编程语言,.NET是一个笼统的术语,通常涵盖.NET Framework(应用程序框架库)和公共语言运行时,即运行.NET程序集的运行时。

Microsoft的C#实现与.NET Framework高度集成,因此可以将这两个概念混淆是可以理解的。但是,重要的是要了解它们是两个截然不同的事物。

这是用C#编写的类:

class Example { }

这是一个用C#编写的类,它明确使用.NET框架的程序集,类型和方法:

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

此外,之所以使用短语Microsoft的C#实现是因为还有其他C#实现可用


3
@Tejs-实际上,VB.NET是.NET。VB不是。
埃里克·米克尔森

+1 Andrew Hare。@Tejs:C#和VB都高度集成到.NET中,而不是.NET。.NET是一个框架。根据实例,您可以在Delphi中执行.NET。如果C#是.NET,那么您将能够在Delphi .NET中编写C#,这显然是不可行的,甚至是无法想象的。
Will Marcouiller 2010年

同样,即使我不知道没有.NET或Mono编写C#的人,也没有理由必须使用.NET进行C#编程。
David Thornley,2010年

.NET CLR与类型有关。为了支持多种语言,他们提出了CTS-通用类型系统,该系统定义了必须如何定义类型以及用于控制这些类型的规则,例如继承,对象生存期等。C++ / CLI,C#,VB都是符合这些类型的语言(您可以可能违反此规定,但我不会介入)。。无论使用哪种语言来构造类型,.NET CLR执行时的行为都相同。因此,尽管可以通过CTS进行连接,但语言和.NET可以分别发展。VS2012例如不支持C#6编译器,但可与.NET 4.6一起使用
Frank

55

C#是一种编程语言,.NET是该语言所基于的框架。


49

C#是一种强大的面向对象编程语言,主要在.NET框架上构建。

C#是飞机,.NET是跑道;)


15

C#是一种语言,.NET是一个应用程序框架。.NET库可以在CLR上运行,因此可以在CLR上运行的任何语言也可以使用.NET库。

如果您熟悉Java,则类似... Java是一种基于JVM的语言...尽管任何预组装的Java库都可以由基于JVM的另一种语言使用。


什么意思CLR
Kasun Siyambalapitiya '16

2
通用语言运行时
Yahya-Imam Munir

1
@KasunSiyambalapitiya CLR用于将代码转换为本机代码我的意思是您编写代码c#转换将像这样C#=> CLR =>本机代码。然后它将运行所有平台,例如linux或Windows
logeshpalani98 '19

10

当人们谈论“ .net框架”时,他们倾向于将两个主要方面结合在一起-运行时库和实际运行.net代码的虚拟机。

当您在Visual Studio中使用C#创建类库时,DLL遵循规定的格式-非常粗略地讲,该部分包含元数据,该元数据描述了其中包含的类以及它们具有的功能,等等。在二进制文件中,这些对象存在。这种常见的.net格式使得可以轻松地在.net语言(C#,VB.Net,F#和其他语言)之间共享库。尽管现在许多.net“运行时库”都是用C#编写的(我相信),但是您可以想象有多少本可以用非托管语言编写的,但是以这种规定的格式排列,以便它们可以被.net语言使用。 。

您构建的库的真正“实质”由CIL(“通用中间语言”)组成,它有点像.net的汇编语言-再次,该语言是所有.net语言的通用输出。使.net库可以由任何.net语言使用。

使用Microsoft SDK中免费提供的工具“ ildasm.exe”(可能已经在您的计算机上提供),您可以查看如何将C#代码转换为元数据和IL。我在此答案的底部提供了一个示例作为示例。

当您运行执行.net代码时,通常发生的情况是.net虚拟机正在读取该IL并对其进行处理。这是.net的另一面,同样,您可能会想像它可以轻松地以非托管语言编写-它“仅”需要读取VM指令并运行它们(并与垃圾收集器集成,这也需要而不是.net代码)。

我所描述的是(再次大致来说)在Visual Studio中构建可执行文件时发生的情况(有关更多信息,我强烈推荐这本书“ Jeffrey Richter通过C#进行CLR”-这本书非常详细且写得很好)。

但是,有时您可能会编写不会在.net环境中执行的C#-例如,Bridge.NET将C#代码“编译”到JavaScript中,然后在浏览器中运行(产生它的团队已经编写用JavaScript编写的.net运行时库版本的工作,因此.net库的强大功能和灵活性可用于生成的JavaScript)。这是将C#和.net分开的完美示例-可以为不同的“目标”编写C#。您可以针对.net运行时环境(在构建可执行文件时),也可以针对浏览器环境(在使用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

// =============================================================

8

在.NET中,您不会仅找到C#。例如,您可以找到Visual Basic。如果某项工作需要.NET知识,则可能需要一名了解.NET框架提供的整套语言集的程序员。


1
您绝对正确,感谢您的平视。虽然我只提C#在这个问题上,但在特定的工作职位,它提到VB以及..
宝霞

5

C#是一种编程语言。

.Net是用于在Windows上构建应用程序的框架。

.Net框架不限于C#。不同的语言可以针对.Net框架并使用该框架构建应用程序。例如F#或VB.Net



3

在这里,我为您提供了一个链接,其中解释了什么是C#语言.NET Framework平台体系结构。请记住,C#是一种通用的,面向对象的编程语言,它在.NET Framework上运行。

.NET Framework包含一个名为Framework Class Library(FCL)的大型类库,并提供用户界面,数据访问,数据库连接,加密,Web应用程序开发,数字算法和网络通信。

.NET Framework由Microsoft开发,主要在Microsoft Windows上运行。

Microsoft Docs对C#语言和.NET Framework的介绍

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.