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


204

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


41
요구 사항 게시를 설명 할 수 있습니다. .NET이 아닌 개발자가 작성했습니다. 구별을 이해할 필요가없는 HR 또는 경영진.
David

2
당신 말이 맞아요. 둘 사이를 알아야합니다. 나는 C #을 꽤 오랫동안 사용 해 왔으며 C #을 코딩 할 때 항상 .Net 라이브러리 클래스를 사용하지만 두 코드를 구별하는 데 시간이 걸리지 않습니다. 그러나 이제는 감사합니다 ..
Bopha

답변:


128

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

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

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


197

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 # 구현 이 있기 때문 입니다.


3
@Tejs-실제로 VB.NET은 .NET입니다. VB는 그렇지 않습니다.
Eric Mickelsen

앤드류 헤어 +1 @Tejs : C #과 VB는 .NET에 많이 통합되어 있으며 .NET은 아닙니다. .NET은 프레임 워크입니다. 인스턴스별로 델파이에서 .NET을 수행 할 수 있습니다. C #이 .NET이면 Delphi .NET에서 C #을 코딩 할 수 있습니다.
Will Marcouiller

마찬가지로 C #으로 프로그래밍하기 위해 .NET을 가져야 할 이유는 없지만 .NET 또는 Mono없이 C #을 작성하는 사람은 아무도 모릅니다.
David Thornley

.NET CLR은 모든 유형에 관한 것입니다. 여러 언어를 지원하기 위해 유형을 정의해야하는 방법과이를 제어하는 ​​규칙 (예 : 상속, 객체 수명 등)을 정의하는 CTS-공통 유형 시스템이 제공됩니다. C ++ / CLI, C #, VB는 모두 이러한 유형을 준수하는 언어입니다 (사용자 위반 할 수는 있지만 들어 가지 않습니다). 형식을 구성하는 데 사용하는 언어에 관계없이 .NET CLR에서 실행하면 동작이 동일합니다. 따라서 CTS를 통한 연결이 있지만 언어와 .NET은 개별적으로 발전 할 수 있습니다. VS2012 예 : C # 6 컴파일러는 지원하지 않지만 .NET 4.6에서 작동
Frank Q.


49

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

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


15

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

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


무엇을 의미 CLR합니까?
Kasun Siyambalapitiya

2
공용 언어 런타임
Yahya-Imam Munir

1
@KasunSiyambalapitiya CLR 코드를 원시 코드로 변환하는 데 사용되는 CLR 코드 C #을 작성한다는 의미는 C # => CLR => 네이티브 코드와 같습니다. 그러면 리눅스 나 윈도우와 같은 모든 플랫폼을 실행합니다
logeshpalani98

10

사람들이 ".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

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

8

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


1
당신은 절대적으로 옳고 헤드 업 주셔서 감사합니다. 이 질문에서는 C # 만 언급하지만 특정 채용 공고에서는 VB도 언급합니다.
Bopha

5

C #은 프로그래밍 언어입니다.

.Net은 Windows에서 응용 프로그램을 작성하는 데 사용되는 프레임 워크입니다.

.Net 프레임 워크는 C #으로 제한되지 않습니다. 다른 언어는 .Net 프레임 워크를 대상으로하고 해당 프레임 워크를 사용하여 애플리케이션을 빌드 할 수 있습니다. 예는 F # 또는 VB.Net입니다.


4

C#별도의 런타임 라이브러리가 없습니다. .NET런타임 라이브러리로 사용 합니다.


당신은 마이크로 소프트의 c # 구현을 의미합니다.
Nishant George Agrwal

예. 다른 구현에 대해서는 전혀 모른다.
Jude

Andrew Hare가 그의 답변에서 언급했듯이 Mono c #
Vort3x

3

여기에서는 C # 언어.NET Framework 플랫폼 아키텍처를 설명하는 링크를 제공했습니다 . C #은 범용 객체 지향 프로그래밍 언어이며 .NET Framework에서 실행됩니다.

.NET Framework에는 FCL (Framework Class Library)이라는 대형 클래스 라이브러리가 포함되어 있으며 사용자 인터페이스, 데이터 액세스, 데이터베이스 연결, 암호화, 웹 응용 프로그램 개발, 숫자 알고리즘 및 네트워크 통신을 제공합니다.

.NET Framework는 주로 Microsoft Windows에서 실행되는 Microsoft에서 개발했습니다.

Microsoft Docs의 C # 언어 및 .NET Framework 소개

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.