C#と.NETの違いは何ですか?C#について考えると、すぐに.NET言語だと思いますが、求人情報を検索する場合、候補者にはC#と.NETの経験があることが必要です。誰かが説明してくれますか?
C#と.NETの違いは何ですか?C#について考えると、すぐに.NET言語だと思いますが、求人情報を検索する場合、候補者にはC#と.NETの経験があることが必要です。誰かが説明してくれますか?
回答:
アンドリューが言ったことに加えて、それは注目に値します:
言語、ランタイム、およびライブラリの違いは、.NET / C#では、C ++の場合よりも厳密であり、言語仕様にはいくつかの基本的なライブラリ関数も含まれています。C#仕様では、環境についてはほんの少ししか述べられていません(基本的に、にはいくつかのタイプが含まれている必要がありますint
が、多かれ少なかれすべてです)。
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#の実装があるためです。
C#は言語、.NETはアプリケーションフレームワークです。.NETライブラリはCLRで実行できるため、CLRで実行できるすべての言語で.NETライブラリを使用できます。
Javaに精通している場合、これは似ています... JavaはJVMの上に構築された言語です...事前にアセンブルされたJavaライブラリはすべて、JVMの上に構築された別の言語で使用できます。
CLR
ですか?
人々が「.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
// =============================================================
.NETでは、C#だけが見つかりません。たとえば、Visual Basicを見つけることができます。ジョブが.NETの知識を必要とする場合、おそらく.NETフレームワークによって提供される言語のセット全体を知っているプログラマーが必要です。
C#
別のランタイムライブラリはありません。.NET
ランタイムライブラリとして使用します。
ここでは、C#言語と.NET Frameworkプラットフォームアーキテクチャとは何かを説明するリンクを提供しました。C#は汎用のオブジェクト指向プログラミング言語であり、.NET Framework上で実行されることに注意してください。
.NET Frameworkには、Framework Class Library(FCL)という名前の大きなクラスライブラリが含まれており、ユーザーインターフェイス、データアクセス、データベース接続、暗号化、Webアプリケーション開発、数値アルゴリズム、およびネットワーク通信を提供します。
.NET Frameworkは、主にMicrosoft Windowsで動作するMicrosoftによって開発されました。