2010-04-27 25 views
119

Darf ich wissen, was ist der Unterschied zwischen C# und .NET? Wenn ich an C# denke, würde ich sofort sagen, dass es sich um eine .NET-Sprache handelt, aber wenn ich nach Stellenangeboten suche, müssen Kandidaten C# - und .NET-Erfahrung haben. Kann mir jemand eine Erklärung geben?Was ist der Unterschied zwischen C# und .NET?

+25

Ich kann die Anforderungen Postings erklären ... Sie werden von Nicht-.NET-Entwicklern geschrieben. Entweder HR oder Management Leute, die nicht die Unterscheidung verstehen müssen. – David

+1

Du hast absolut recht, ich sollte zwischen den beiden wissen. Ich benutze C# schon seit einiger Zeit und verwende immer die .Net-Bibliotheksklasse, wenn ich C# codiere, aber nimm niemals Zeit, um zwischen den beiden zu unterscheiden. Aber jetzt weiß ich, danke .. – Bopha

Antwort

78

Zusätzlich zu dem, was Andrew sagte, ist es erwähnenswert, dass:

  • .NET nicht nur eine Bibliothek, sondern auch eine Laufzeit ist für Anwendungen ausgeführt werden.
  • Die Kenntnis von C# impliziert einige Kenntnisse von .NET (weil das C# -Objektmodell dem .NET-Objektmodell entspricht und Sie in C# nur mithilfe von .NET-Bibliotheken etwas Interessantes tun können). Das Gegenteil ist nicht unbedingt richtig, da Sie andere Sprachen zum Schreiben von .NET-Anwendungen verwenden können.

Die Unterscheidung zwischen einer Sprache, eine Laufzeit und eine Bibliothek ist strenger in .NET/C# als beispielsweise in C++, wo die Sprache Spezifikation enthält auch einige grundlegenden Bibliotheksfunktionen.Die C# -Spezifikation sagt nur sehr wenig über die Umgebung aus (im Grunde sollte sie einige Typen wie int enthalten, aber das ist mehr oder weniger alles).

139

C# ist eine Programmiersprache, .NET ist ein allgemeiner Begriff, der sowohl das .NET Framework (eine Anwendungsframework-Bibliothek) als auch die Common Language Runtime umfasst, die die Laufzeit ist, in der .NET-Assemblys ausgeführt werden.

Microsofts Implementierung von C# ist stark in .NET Framework integriert, daher ist es verständlich, dass die beiden Konzepte verwechselt werden. Es ist jedoch wichtig zu verstehen, dass es sich um zwei sehr unterschiedliche Dinge handelt.

Hier ist eine Klasse in C# geschrieben:

class Example { } 

Hier ist eine Klasse in C# geschrieben, die eine Framework-Assembly explizit verwendet, die Art und Methode:

class Example 
{ 
    static void Main() 
    { 
     // Here we call into the .NET framework to 
     // write to the output console 
     System.Console.Write("hello, world"); 
    } 
} 

Wie ich bereits erwähnt Zuvor ist es sehr schwierig, die Microsoft-Implementierung von C# zu verwenden, ohne das .NET-Framework zu verwenden. Meine erste Example Implementierung oben verwendet sogar das .NET-Framework (implizit ja, aber es nutzt es trotzdem), weil Example erbt von System.Object.

Auch der Grund, warum ich den Ausdruck verwenden Microsofts Implementierung von C# ist, weil es other implementations of C# available gibt.

+3

@Tejs - Eigentlich ist VB.NET .NET. VB ist nicht. –

+1

Vielleicht wird der Unterschied zwischen den beiden noch deutlicher, sobald andere .NET-basierte Programmiersprachen die Bühne betreten: Es gibt VB.NET, F #, J #, IronPython, IronRuby, und ich höre sogar, dass COBOL es auf die .NET-Plattform geschafft hat . – stakx

+0

+1 Andrew Hare. @Tejs: Sowohl C# als auch VB sind stark in .NET integriert, es ist nicht .NET. .NET ist ein Framework. Wie pro Instanz können Sie .NET in Delphi tun. Wenn C# .NET ist, dann könnten Sie C# in Delphi .NET codieren, was eindeutig nicht machbar und sogar nicht vorstellbar ist. –

37

C# ist eine Programmiersprache, .NET ist das Framework, auf dem die Sprache aufgebaut ist.

6

In .NET finden Sie nicht nur C#. Sie können Visual Basic zum Beispiel finden. Wenn für einen Job .NET-Kenntnisse erforderlich sind, benötigt er wahrscheinlich einen Programmierer, der die gesamte Palette der vom .NET-Framework bereitgestellten Sprachen kennt.

+1

du hast absolut recht und danke für den headup. Obwohl ich nur C# in dieser Frage erwähne, aber in diesem speziellen Stellenposten, erwähnt es auch VB. – Bopha

13

C# ist eine Sprache, .NET ist ein Anwendungsframework. Die .NET-Bibliotheken können auf der CLR ausgeführt werden. Daher kann jede Sprache, die auf der CLR ausgeführt werden kann, auch die .NET-Bibliotheken verwenden.

Wenn Sie mit Java vertraut sind, ist dies ähnlich ... Java ist eine Sprache auf der JVM gebaut ... obwohl jede der vorbereiteten Java-Bibliotheken von einer anderen Sprache verwendet werden kann, die auf dem JVM.

+0

was ist mit 'CLR' gemeint? –

+1

Common Language Runtime –

24

C# ist eine starke objektorientierte Programmiersprache, die hauptsächlich auf dem .NET Framework basiert.

C# ist das Flugzeug und .NET ist die Landebahn;)

3

C# nicht eine separate Laufzeitbibliothek hat. Es verwendet .NET als eine Laufzeitbibliothek.

+0

Sie meinen Microsofts Implementierung von C#. – niagr

+0

Ja. Ich habe keine Ahnung von anderen Implementierungen. – Jude

+0

Wie Andrew Hare in seiner Antwort erwähnt, Mono C# – Vort3x

7

Wenn Leute über das ".net-Framework" sprechen, kombinieren sie in der Regel zwei Hauptbereiche - die Laufzeitbibliothek und die virtuelle Maschine, die den .NET-Code tatsächlich ausführt.

Wenn Sie eine Klassenbibliothek in Visual Studio in C# erstellen, folgt die DLL einem vorgeschriebenen Format - sehr grob gibt es einen Abschnitt, der Metadaten enthält, die beschreibt, welche Klassen darin enthalten sind und welche Funktionen sie haben, etc .. und das beschreibt, wo in der Binärdatei diese Objekte existieren. Dieses gängige .net-Format erlaubt es, Bibliotheken problemlos zwischen .net-Sprachen (C#, VB.Net, F # und anderen) zu teilen. Obwohl ein Großteil der .net "Laufzeitbibliothek" jetzt in C# geschrieben ist (ich glaube), können Sie sich vorstellen, wie viele von ihnen in nicht verwalteten Sprachen geschrieben sein könnten, aber in diesem vorgeschriebenen Format angeordnet sind, damit sie von .net-Sprachen konsumiert werden können .

Das echte "Fleisch" der Bibliothek, die Sie erstellen, besteht aus CIL ("Common Intermediate Language"), die ein bisschen wie die Assemblersprache von .net ist - wieder ist diese Sprache die gemeinsame Ausgabe aller .net-Sprachen Dies macht die .net-Bibliotheken in jeder .net-Sprache konsumierbar.

Mit dem Tool "ildasm.exe", das in Microsoft SDKs frei verfügbar ist (und sich möglicherweise bereits auf Ihrem Computer befindet), können Sie sehen, wie C# -Code in Metadaten und IL konvertiert wird. Ich habe ein Beispiel am Ende dieser Antwort als Beispiel eingefügt.

Wenn Sie ausführen. NET-Code ausführen, was passiert normalerweise ist die .net virtuelle Maschine liest, dass IL und verarbeiten es. Dies ist die andere Seite von .net, und wiederum können Sie sich wahrscheinlich vorstellen, dass dies leicht in einer nicht verwalteten Sprache geschrieben werden könnte - es "braucht" nur VM-Anweisungen zu lesen und auszuführen (und in den Garbage Collector zu integrieren, die ebenfalls benötigt werden) nicht sein. NET-Code).

Was ich beschrieben habe ist (wieder ungefähr), was passiert, wenn Sie eine ausführbare Datei in Visual Studio erstellen (für weitere Informationen empfehle ich das Buch "CLR via C# von Jeffrey Richter" - es ist sehr detailliert und exzellent geschrieben).

Es gibt Zeiten, in denen Sie C# schreiben könnten, die nicht in einer .net-Umgebung ausgeführt werden - beispielsweise Bridge.NET "kompiliert" C# -Code in JavaScript, das dann im Browser ausgeführt wird (das Team, das es erzeugt haben sich die Mühe gemacht, Versionen der .net-Laufzeitbibliothek zu schreiben, die in JavaScript geschrieben sind und so die Leistungsfähigkeit und Flexibilität der .net-Bibliothek für das generierte JavaScript zur Verfügung stellt). Dies ist ein perfektes Beispiel für die Trennung zwischen C# und .net - es ist möglich, C# für verschiedene "Ziele" zu schreiben; Sie können auf die .NET-Laufzeitumgebung abzielen (wenn Sie eine ausführbare Datei erstellen) oder auf die Browserumgebung (wenn Sie Bridge.NET verwenden).

A (sehr) einfaches Beispiel Klasse:

using System; 

namespace Example 
{ 
    public class Class1 
    { 
     public void SayHello() 
     { 
      Console.WriteLine("Hello"); 
     } 
    } 
} 

Die erhaltenen Metadaten und IL (via ildasm abgerufen.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 

// ============================================================= 
1

Hier bereitgestellt ich Ihnen einen Link, wo erklären, was C# Sprache und die .NET Framework Platform Architecture. Denken Sie daran, dass C# eine allgemeine, objektorientierte Programmiersprache ist und auf dem .NET Framework ausgeführt wird.

.NET Framework enthält eine große Klassenbibliothek namens Framework Class Library (FCL) und bietet Benutzerschnittstelle, Datenzugriff, Datenbankkonnektivität, Kryptographie, Webanwendungsentwicklung, numerische Algorithmen und Netzwerkkommunikation.

.NET Framework wurde von Microsoft entwickelt, das hauptsächlich auf Microsoft Windows ausgeführt wird.

Introduction to the C# Language and the .NET Framework

1

C# ist eine Programmiersprache.

.Net ist ein Framework zum Erstellen von Anwendungen unter Windows.

.Net-Framework ist nicht auf C# beschränkt. Verschiedene Sprachen können auf das .NET-Framework abzielen und Anwendungen mit diesem Framework erstellen. Beispiele sind F # oder VB.Net

Verwandte Themen