C# 和 .NET 有啥区别?

Posted

技术标签:

【中文标题】C# 和 .NET 有啥区别?【英文标题】:What is the difference between C# and .NET?C# 和 .NET 有什么区别? 【发布时间】:2011-02-13 01:40:14 【问题描述】:

我可以知道 C# 和 .NET 之间有什么区别吗?当我想到 C# 时,我马上会说它是一种 .NET 语言,但是当我搜索职位时,他们要求候选人具有 C# 和 .NET 经验。谁能给我解释一下?

【问题讨论】:

我可以解释需求发布...它们是由非.NET 开发人员编写的。不需要了解区别的人力资源或管理人员。 你说得对,我应该知道两者之间的关系。我使用 C# 已经有一段时间了,在编写 C# 代码时总是使用 .Net 库类,但从不花时间区分两者。但现在我知道了,谢谢.. 如果您有 C# 方面的经验,那么您在 .NET 方面也有不错的经验。像Console.Write() 这样的函数和像List 这样的类是.NET 库的一部分,这意味着它们也可以被其他.NET 语言(如VB.NET)访问。除非您一直在以一种不寻常的方式使用 C#,否则您不能没有另一个。 【参考方案1】:

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's implementation of C#是因为有other implementations of C# available。

【讨论】:

@Tejs - 实际上,VB.NET 就是 .NET。 VB 不是。 +1 安德鲁·哈尔。 @Tejs:C# 和 VB 都高度集成到 .NET,它不是 .NET。 .NET 是一个框架。根据实例,您可以在 Delphi 中执行 .NET。如果 C# 是 .NET,那么您将能够在 Delphi .NET 中编写 C#,这显然是不可行的,甚至是不可想象的。 同样,你没有理由必须有 .NET 才能用 C# 编程,尽管我不知道有没有人编写 C# 而没有 .NET 或 Mono。 .NET CLR 都是关于类型的。为了支持多种语言,他们提出了 CTS - 通用类型系统,它定义了必须如何定义类型以及管理它们的规则,例如继承、对象生命周期等。C++/CLI、C#、VB 都是符合这些类型的语言(你可能违反了这一点,但我不会涉及它)。 .无论您使用什么语言来构造类型,当由 .NET CLR 执行时,行为都是相同的。因此,尽管通过 CTS 连接,但语言和 .NET 可以分开发展。 VS2012 例如不支持 C# 6 编译器,但适用于 .NET 4.6 也许编辑这个答案以包含一个用 VB.NET 编写的Example 类会让人明白这一点。直到我不得不使用 VB.NET 并意识到我可以从 VB.NET 调用典型的 .NET 类和方法,如 Console.Write()List 之前,我才真正理解 C# 和 .NET 之间的区别。如今,我认为 .NET 是可从所有 .NET 语言访问的函数和类的公共池。您可以创建一种名为 Jellybean.NET 的新编程语言。语法会有所不同,但可以访问完全相同的方法和类。【参考方案2】:

除了Andrew's answer之外,值得注意的是:

.NET 不仅仅是一个,还是一个用于执行应用程序的运行时。 C# 的知识意味着对 .NET 的一些了解(因为 C# 对象模型对应于 .NET 对象模型,您可以通过使用 .NET 库在 C# 中做一些有趣的事情)。反之亦然,因为您可以使用其他语言编写 .NET 应用程序。

languageruntimelibrary 之间的区别在 .NET/C# 中比在 C++ 中更为严格,其中语言规范还包括一些基本的库函数。 C# 规范对环境只说了很少的内容(基本上,它应该包含一些类型,例如int,但或多或​​少都是这样)。

【讨论】:

可能值得在第一点添加 runtime 的定义(与语言/库不同)。这是一个很好的:***.com/a/3900802/6165072【参考方案3】:

C# 是一种编程语言,.NET 是构建该语言的框架。

【讨论】:

【参考方案4】:

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

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

【讨论】:

【参考方案5】:

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

如果您熟悉 Java,则类似... Java 是构建在 JVM 之上的语言...尽管任何预组装的 Java 库都可以被构建在 JVM 之上的另一种语言使用.

【讨论】:

CLR是什么意思? 公共语言运行时 @KasunSiyambalapitiya CLR 用于将代码转换为本机代码我的意思是您编写代码 c# 转换将像这样 C# => CLR => 本机代码。然后它将运行所有平台,如 linux 或 windows【参考方案6】:

当人们谈论“.net 框架”时,他们往往会结合两个主要领域 - 运行时库和实际运行 .net 代码的虚拟机。

当您在 C# 中的 Visual Studio 中创建类库时,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 的“CLR via C#”一书——它非常详细且写得非常出色) .

但是,有时您可能会编写不会在 .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

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

【讨论】:

【参考方案7】:

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

【讨论】:

您说得对,感谢您的提醒。虽然我在这个问题中只提到了 C#,但是在那个特定的工作帖子中,它也提到了 VB..【参考方案8】:

C# 是一种编程语言。

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

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

【讨论】:

【参考方案9】:

C# 没有单独的运行时库。它使用.NET 作为运行时库。

【讨论】:

你的意思是微软的c#实现。 是的。我不知道其他实现。 正如 Andrew Hare 在他的回答中提到的那样,Mono c#【参考方案10】:

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

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

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

Introduction to the C# Language and the .NET Framework from Microsoft Docs

【讨论】:

以上是关于C# 和 .NET 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

C#中访问说明符保护和内部保护有啥区别

.NET 正则表达式中的“组”和“捕获”有啥区别?

asp.net和ado.net有啥区别?

Java与ASP.NET有啥区别

C# .net不同版本中winform控件 dataGrid /DataGrid/DataGridView 有啥区别

C# 中各种线程同步选项有啥区别?