[C#] C #과 .NET의 차이점은 무엇입니까?

C #과 .NET의 차이점이 무엇인지 알 수 있습니까? C #을 생각하면 바로 .NET 언어라고 말할 수 있지만 구직을 검색 할 때는 C # 및 .NET 경험이 있어야합니다. 누군가 나에게 설명을 해 줄 수 있습니까?



답변

Andrew가 말한 것 외에도 다음과 같은 점에 주목할 가치가 있습니다.

  • .NET은 라이브러리 일뿐 만 아니라 응용 프로그램 실행을 위한 런타임 이기도합니다 .
  • C #에 대한 지식은 .NET에 대한 지식을 의미합니다 (C # 개체 모델이 .NET 개체 모델에 해당하고 .NET 라이브러리를 사용하여 C #에서 흥미로운 작업을 수행 할 수 있기 때문). 다른 언어를 사용하여 .NET 응용 프로그램을 작성할 수 있으므로 반대의 경우는 아닙니다.

의 구분 언어 하는 런타임라이브러리는 C의 예를 들어 ++ 언어 사양도 몇 가지 기본 라이브러리 함수를 포함한다보다 .NET / C #에서 더 엄격하다. C # 사양은 환경에 대해 거의 말하지 않습니다 (기본적으로와 같은 일부 유형을 포함해야 int하지만 거의 전부입니다).


답변

C #은 프로그래밍 언어이며 .NET은 .NET Framework (응용 프로그램 프레임 워크 라이브러리)와 .NET 어셈블리가 실행되는 런타임 인 ​​공용 언어 런타임을 모두 포함하는 포괄적 인 용어입니다.

Microsoft의 C # 구현은 .NET Framework와 크게 통합되므로 두 가지 개념이 혼동 될 수 있습니다. 그러나 그것들이 매우 다른 두 가지라는 것을 이해하는 것이 중요합니다.

C #으로 작성된 클래스는 다음과 같습니다.

class Example { }

다음은 .NET 프레임 워크 어셈블리, 형식 및 메서드를 명시 적으로 사용하는 C #으로 작성된 클래스입니다.

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위의 첫 번째 구현은에서 Example상속 하기 때문에 .NET 프레임 워크를 사용합니다 (암시 적으로도 그래도 그럼에도 사용합니다) System.Object.

또한 Microsoft의 C # 구현 문구를 사용하는 이유 는 다른 C # 구현 이 있기 때문 입니다.


답변

C #은 프로그래밍 언어이며 .NET은 언어가 구축 된 프레임 워크입니다.


답변

C #은 강력한 .NET 프레임 워크를 기반으로하는 강력한 객체 지향 프로그래밍 언어입니다.

C #은 비행기이고 .NET은 활주로입니다.)


답변

C #은 언어이고 .NET은 응용 프로그램 프레임 워크입니다. .NET 라이브러리는 CLR에서 실행될 수 있으므로 CLR에서 실행할 수있는 모든 언어는 .NET 라이브러리를 사용할 수도 있습니다.

Java에 익숙한 경우 비슷합니다. Java는 JVM 위에 빌드 된 언어입니다. 그러나 사전 조립 된 Java 라이브러리는 JVM 위에 빌드 된 다른 언어로 사용할 수 있습니다.


답변

사람들이 “.net 프레임 워크”에 대해 이야기 할 때 런타임 라이브러리와 실제로 .net 코드를 실행하는 가상 머신이라는 두 가지 주요 영역을 결합하는 경향이 있습니다.

C #의 Visual Studio에서 클래스 라이브러리를 만들 때 DLL은 규정 된 형식을 따릅니다. 매우 대략적으로, 클래스에 포함 된 클래스와 그 기능 등을 설명하는 메타 데이터가 포함 된 섹션이 있습니다. 바이너리에는 이러한 객체가 존재합니다. 이 일반적인 .net 형식은 라이브러리를 .net 언어 (C #, VB.Net, F # 및 기타)간에 쉽게 공유 할 수 있도록합니다. .net “런타임 라이브러리”의 많은 부분이 C #으로 작성되었지만 (관리자 언어로는 작성되지 않았지만,이 규정 된 형식으로 정렬되어 .net 언어로 소비 될 수 있음) .

빌드 한 라이브러리의 실제 “고기”는 .net의 어셈블리 언어와 약간 비슷한 CIL ( “공통 중급 언어”)로 구성됩니다.이 언어는 모든 .net 언어의 공통 출력입니다. .net 라이브러리는 모든 .net 언어로 소모품을 사용할 수 있습니다.

Microsoft SDK에서 무료로 사용할 수 있고 이미 컴퓨터에있을 수있는 “ildasm.exe”도구를 사용하면 C # 코드가 메타 데이터와 IL로 변환되는 방식을 확인할 수 있습니다. 이 답변의 맨 아래에 예제로 샘플을 포함 시켰습니다.

.net 코드 실행을 실행할 때 일반적으로 발생하는 것은 .net 가상 머신이 해당 IL을 읽고 처리하는 것입니다. 이것은 .net의 다른 측면이며, 관리되지 않는 언어로 쉽게 작성할 수 있다고 상상할 수 있습니다. VM 명령을 읽고 실행해야하며 가비지 수집기와 통합해야합니다. .net 코드가 아님).

내가 설명 한 것은 Visual Studio에서 실행 파일을 빌드 할 때 발생하는 현상입니다 (자세한 내용은 “CLR via C # by Jeffrey Richter”를 강력히 권장합니다).

그러나 .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

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


답변

.NET에서는 C # 만 찾을 수 없습니다. 예를 들어 Visual Basic을 찾을 수 있습니다. 작업에 .NET 지식이 필요한 경우 .NET 프레임 워크에서 제공하는 전체 언어 세트를 알고있는 프로그래머가 필요할 수 있습니다.