Was ist der Unterschied zwischen C # und .NET?

204

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

Bopha
quelle
41
Ich kann die Anforderungspostings erklären ... Sie wurden von Nicht-.NET-Entwicklern geschrieben. Entweder HR- oder Management-Leute, die den Unterschied nicht verstehen MÜSSEN.
David
2
Du hast absolut recht, ich sollte es zwischen den beiden wissen. Ich benutze C # schon seit einiger Zeit und verwende beim Codieren von C # immer die .Net-Bibliotheksklasse, nehme mir aber nie Zeit, um zwischen den beiden zu unterscheiden. Aber jetzt weiß ich, danke ..
Bopha

Antworten:

128

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

  • .NET ist nicht nur eine Bibliothek , sondern auch eine Laufzeit zum Ausführen von Anwendungen.
  • Die Kenntnis von C # setzt einige Kenntnisse von .NET voraus (da das C # -Objektmodell dem .NET-Objektmodell entspricht und Sie in C # etwas Interessantes tun können, indem Sie einfach .NET-Bibliotheken verwenden). Das Gegenteil ist nicht unbedingt der Fall, da Sie zum Schreiben von .NET-Anwendungen andere Sprachen verwenden können.

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

Tomas Petricek
quelle
197

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

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

Hier ist eine in C # geschriebene Klasse:

class Example { }

Hier ist eine in C # geschriebene Klasse, die explizit eine .NET Framework-Assembly, einen Typ und eine Methode verwendet:

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

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

Der Grund, warum ich den Ausdruck "Implementierung von C # durch Microsoft" verwende, ist, dass andere Implementierungen von C # verfügbar sind .

Andrew Hare
quelle
3
@Tejs - Eigentlich ist VB.NET .NET. VB ist nicht.
Eric Mickelsen
+1 Andrew Hare. @Tejs: Sowohl C # als auch VB sind stark in .NET integriert, es ist nicht .NET. .NET ist ein Framework. Sie können .NET in Delphi ausführen. Wenn C # .NET ist, können Sie C # in Delphi .NET codieren, was eindeutig nicht machbar und sogar nicht vorstellbar ist.
Will Marcouiller
Ebenso gibt es keinen Grund, warum Sie .NET benötigen, um in C # zu programmieren, obwohl ich niemanden kenne, der C # ohne .NET oder Mono schreibt.
David Thornley
In .NET CLR dreht sich alles um Typen. Um mehrere Sprachen zu unterstützen, haben sie ein CTS - Common Type System entwickelt, das definiert, wie Typen definiert werden müssen, und Regeln, die sie regeln, z. B. Vererbung, Objektlebensdauer usw. C ++ / CLI, C #, VB sind alle Sprachen, die diesen Typen entsprechen (Sie könnte dies verletzen, aber ich werde nicht darauf eingehen). Unabhängig davon, in welcher Sprache Sie den Typ erstellen, ist das Verhalten bei Ausführung durch .NET CLR gleich. Daher können sich Sprache und .NET getrennt entwickeln, obwohl eine Verbindung über das CTS besteht. VS2012 unterstützt zB keinen C # 6-Compiler, funktioniert aber mit .NET 4.6
Frank Q.
55

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

Heisenberg
quelle
49

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

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

Fareevar
quelle
15

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

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

Polaris878
quelle
Was ist gemeint mit CLR?
Kasun Siyambalapitiya
2
Common Language Runtime
Yahya-Imam Munir
1
@KasunSiyambalapitiya CLR, die zum Konvertieren in Code in nativen Code verwendet wird Ich meine, Sie schreiben einen Code c # Die Konvertierung erfolgt wie folgt: C # => CLR => Native Code. Dann werden alle Plattformen wie Linux oder Windows ausgeführt
logeshpalani98
10

Wenn Leute über das ".net Framework" sprechen, kombinieren sie normalerweise zwei Hauptbereiche - die Laufzeitbibliothek und die virtuelle Maschine, auf der der .net-Code tatsächlich ausgeführt wird.

Wenn Sie eine Klassenbibliothek in Visual Studio in C # erstellen, folgt die DLL einem vorgeschriebenen Format. Grob gesagt gibt es einen Abschnitt, der Metadaten enthält, in denen beschrieben wird, welche Klassen darin enthalten sind und welche Funktionen sie haben usw. und in denen beschrieben wird, wo In der Binärdatei existieren diese Objekte. Dieses gemeinsame .net-Format ermöglicht die einfache gemeinsame Nutzung von Bibliotheken zwischen .net-Sprachen (C #, VB.Net, F # und anderen). Obwohl ein Großteil der .net- "Laufzeitbibliothek" jetzt in C # geschrieben ist (glaube ich), können Sie sich vorstellen, wie viele von ihnen in nicht verwalteten Sprachen geschrieben, aber in diesem vorgeschriebenen Format angeordnet sein könnten, damit sie von .net-Sprachen verwendet werden können .

Das eigentliche "Fleisch" der Bibliothek, die Sie erstellen, besteht aus CIL ("Common Intermediate Language"), das der Assemblersprache von .net ein wenig ähnelt. Auch diese Sprache ist die gemeinsame Ausgabe aller .net-Sprachen macht .net-Bibliotheken für jede .net-Sprache nutzbar.

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 Execute .net Code ausführen, passiert häufig, dass die virtuelle .net Virtual Machine diese IL liest und verarbeitet. Dies ist die andere Seite von .net, und Sie können sich wahrscheinlich vorstellen, dass dies leicht in einer nicht verwalteten Sprache geschrieben werden kann - es muss "nur" VM-Anweisungen lesen und ausführen (und in den Garbage Collector integrieren, der ebenfalls benötigt wird) nicht .net Code sein).

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 hervorragend geschrieben).

Es kann jedoch vorkommen, dass Sie C # schreiben, das nicht in einer .net-Umgebung ausgeführt wird. Beispielsweise "kompiliert" Bridge.NET C # -Code in JavaScript, das dann im Browser ausgeführt wird (das Team, das es erstellt hat) Der Aufwand für das Schreiben von Versionen der .net-Laufzeitbibliothek, die in JavaScript geschrieben sind, und damit die Leistungsfähigkeit und Flexibilität der .net-Bibliothek für das generierte JavaScript. 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).

Eine (sehr) einfache Beispielklasse:

using System;

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

Die resultierenden Metadaten und IL (abgerufen über 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

// =============================================================
Dan Roberts
quelle
8

In .NET finden Sie nicht nur C #. Sie können beispielsweise Visual Basic finden. Wenn für einen Job .NET-Kenntnisse erforderlich sind, ist wahrscheinlich ein Programmierer erforderlich, der alle vom .NET-Framework bereitgestellten Sprachen kennt.

Maurizio Reginelli
quelle
1
Du hast absolut Recht und danke für das Headup. Ich erwähne zwar nur C # in dieser Frage, aber in dieser speziellen Stellenanzeige wird auch VB erwähnt.
Bopha
5

C # ist eine Programmiersprache.

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

Das .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

Sonevol
quelle
4

C#hat keine separate Laufzeitbibliothek. Es wird .NETals Laufzeitbibliothek verwendet.

Jude
quelle
Sie meinen die Implementierung von c # durch Microsoft.
Nishant George Agrwal
Ja. Ich habe keine Ahnung von anderen Implementierungen.
Judas
Wie Andrew Hare in seiner Antwort erwähnte, Mono c #
Vort3x
3

Hier habe ich Ihnen einen Link bereitgestellt, unter dem Sie erklären, was C # -Sprache und die .NET Framework-Plattformarchitektur sind . Denken Sie daran, dass C # eine universelle, objektorientierte Programmiersprache ist und unter .NET Framework ausgeführt wird.

.NET Framework enthält eine große Klassenbibliothek namens Framework Class Library (FCL) und bietet Benutzeroberfläche, Datenzugriff, Datenbankkonnektivität, Kryptografie, Entwicklung von Webanwendungen, numerische Algorithmen und Netzwerkkommunikation.

.NET Framework wurde von Microsoft entwickelt und läuft hauptsächlich unter Microsoft Windows.

Einführung in die C # -Sprache und .NET Framework aus Microsoft Docs

S. Mayol
quelle