C#と.NETの違いは何ですか?


204

C#と.NETの違いは何ですか?C#について考えると、すぐに.NET言語だと思いますが、求人情報を検索する場合、候補者にはC#と.NETの経験があることが必要です。誰かが説明してくれますか?


41
要件の投稿について説明できます...それらは.NET以外の開発者によって書かれています。区別を理解する必要がない人事担当者または管理担当者。
David

2
あなたは絶対的に正しい、私は2つを知っておくべきだ。私はかなり以前からC#を使用しており、C#をコーディングするときは常に.Netライブラリクラスを使用しますが、2つを区別するのに時間がかかることはありません。しかし、私は知っている、ありがとう..
Bopha 2010

回答:


128

アンドリューが言ったことに加えて、それは注目に値します:

  • .NETは単なるライブラリではなく、アプリケーションを実行するためのランタイムでもあります
  • C#の知識は、.NETのある程度の知識を意味します(C#オブジェクトモデルは.NETオブジェクトモデルに対応し、.NETライブラリを使用するだけでC#で興味深いことができるため)。他の言語を使用して.NETアプリケーションを作成できるため、その逆は必ずしも当てはまりません。

言語ランタイム、およびライブラリの違いは、.NET / C#では、C ++の場合よりも厳密であり、言語仕様にはいくつかの基本的なライブラリ関数も含まれています。C#仕様では、環境についてはほんの少ししか述べられていません(基本的に、にはいくつかのタイプが含まれている必要がありますintが、多かれ少なかれすべてです)。


197

C#はプログラミング言語です。.NETは、.NET Framework(アプリケーションフレームワークライブラリ)と、.NETアセンブリが実行されるランタイムである共通言語ランタイムの両方をカバーする傾向がある包括的な用語です。

MicrosoftのC#の実装は.NET Frameworkと深く統合されているため、2つの概念が混同されていることは理解できます。ただし、これらは2つのまったく異なるものであることを理解することが重要です。

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実装は、上記でも(はい、暗黙のうちに、それにもかかわらず、それを使用しない).NETフレームワークを使用するため、Example継承からSystem.Object

また、MicrosoftのC#の実装というフレーズを使用するのは、にも利用可能なC#の実装があるためです


3
@Tejs-実際、VB.NETは.NETです。VBはそうではありません。
Eric Mickelsen、2010

+1アンドリューヘア。@Tejs:C#とVBはどちらも.NETに高度に統合されており、.NETではありません。.NETはフレームワークです。インスタンスごとに、Delphiで.NETを実行できます。C#が.NETの場合、C#をDelphi .NETでコーディングすることができます。これは明らかに実行不可能であり、想像もできません。
Marcouiller氏、2010

同様に、C#でプログラミングするために.NETを使用する必要がある理由はありませんが、.NETまたはMonoなしでC#を記述している人は知りません。
David Thornley、2010

.NET CLRはすべてタイプに関するものです。複数の言語をサポートするために、彼らはCTS-型を定義する方法とそれらを管理するルールを定義する一般的な型システム、たとえば継承、オブジェクトの存続期間などを考案しました。C++ / CLI、C#、VBはすべてこれらの型に準拠する言語です(これに違反する可能性がありますが、私はそれには入りません)。。型の作成に使用する言語に関係なく、.NET CLRで実行したときの動作は同じです。したがって、CTSを介した接続はありますが、言語と.NETは別々に進化できます。VS2012はC#6コンパイラをサポートしていませんが、.NET 4.6で動作します
フランクQ.


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 2016

1
@KasunSiyambalapitiya CLRはコードをネイティブコードに変換するために使用しました。つまり、コードを記述しますc#変換は次のようになりますC#=> CLR =>ネイティブコード。次に、LinuxやWindowsなどのすべてのプラットフォームを実行します
logeshpalani98

10

人々が「.netフレームワーク」について話すとき、彼らは2つの主要な領域-ランタイムライブラリと.netコードを実際に実行する仮想マシンを組み合わせる傾向があります。

C#のVisual Studioでクラスライブラリを作成すると、DLLは所定の形式に従います-非常に大まかに、それに含まれるクラスやクラスが持つ機能などを説明するメタデータを含むセクションがあり、場所を説明しますバイナリにはそれらのオブジェクトが存在します。この一般的な.net形式により、.net言語(C#、VB.Net、F#など)間でライブラリを簡単に共有できます。.netの「ランタイムライブラリ」の多くは現在C#で記述されています(私はそう思います)が、それらのいくつが管理されていない言語で記述できたが、.net言語で使用できるようにこの所定の形式で配置できるか想像できます。 。

ビルドするライブラリの実際の「肉」は、.netのアセンブリ言語に少し似たCIL(「Common Intermediate Language」)で構成されます。ここでも、この言語はすべての.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ランタイムライブラリのバージョンを記述するための労力であり、生成されたJavaScriptで.netライブラリの機能と柔軟性を利用できます。これは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 Windowsで動作するMicrosoftによって開発されました。

Microsoft DocsによるC#言語と.NET Frameworkの概要

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.