2010-04-27 21 views
119

Posso sapere qual è la differenza tra C# e .NET? Quando penso a C#, direi subito che è un linguaggio .NET, ma quando cerco posti di lavoro, richiedono ai candidati di avere esperienza in C# e .NET. Qualcuno può darmi una spiegazione?Qual è la differenza tra C# e .NET?

+25

Posso spiegare le richieste dei requisiti ... Sono scritte da sviluppatori non- .NET. O risorse umane o di gestione che non hanno bisogno di capire la distinzione. – David

+1

Hai assolutamente ragione, dovrei sapere tra i due. Sto usando C# da un bel po 'di tempo e uso sempre la classe di libreria .Net durante la codifica di C# ma non prendo mai tempo per distinguere tra i due. Ma ora lo so, grazie .. – Bopha

risposta

78

In aggiunta a quanto Andrew ha detto, vale la pena notare che:

  • .NET non è solo una libreria , ma anche un runtime per l'esecuzione di applicazioni.
  • La conoscenza di C# implica una certa conoscenza di .NET (perché l'oggetto del modello C# corrisponde al modello a oggetti .NET e si può fare qualcosa di interessante in C#, semplicemente utilizzando librerie .NET). L'opposto non è necessariamente vero in quanto è possibile utilizzare altri linguaggi per scrivere applicazioni .NET.

La distinzione tra un lingua, un runtime, e un libreria è più severo nel .NET/C# che per esempio in C++, in cui le specifiche del linguaggio include anche alcune funzioni di libreria di base.La specifica C# dice solo pochissimo sull'ambiente (in pratica, dovrebbe contenere alcuni tipi come int, ma questo è più o meno tutto).

139

C# è un linguaggio di programmazione, .NET è un termine generico che tende a coprire sia .NET Framework (una libreria di framework dell'applicazione) che Common Language Runtime che è il runtime in cui vengono eseguiti gli assembly .NET.

implementazione Microsoft di C# è fortemente integrato con il .NET Framework ed è quindi comprensibile che i due concetti sarebbero confusi. Tuttavia è importante capire che sono due cose molto diverse.

Ecco una classe scritta in C#:

class Example { } 

Ecco una classe scritta in C# che utilizza in modo esplicito un assembly .NET framework, il tipo e il metodo:

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

Come ho già detto prima, è molto difficile usare l'implementazione di Microsoft di C# senza usare anche il framework .NET. Il mio primo Example implementazione di sopra anche utilizza il framework .NET (implicitamente, sì, ma non usarlo comunque), perché Example eredita da System.Object.

Inoltre, la ragione per cui utilizzo la frase l'implementazione di Microsoft di C# è perché ci sono other implementations of C# available.

+3

@Tejs - In realtà, VB.NET è .NET. VB non lo è. –

+1

Forse la differenza tra i due diventa ancora più evidente non appena entrano in scena altri linguaggi di programmazione basati su .NET: ci sono VB.NET, F #, J #, IronPython, IronRuby, e sento che anche COBOL è arrivato alla piattaforma .NET. . – stakx

+0

+1 Andrew Hare. @Tejs: Sia C# che VB sono fortemente integrati in .NET, non in .NET. .NET è un framework. Come per esempio, puoi fare .NET in Delphi. Se C# è .NET, sarà possibile codificare C# in Delphi .NET, che non è chiaramente fattibile e nemmeno inconcepibile. –

37

C# è un linguaggio di programmazione, NET è il quadro che il linguaggio è costruito su.

6

In .NET non si trova solo C#. Puoi trovare Visual Basic per esempio. Se un lavoro richiede conoscenze .NET, probabilmente è necessario un programmatore che conosca l'intero set di lingue fornito dal framework .NET.

+1

hai assolutamente ragione e grazie per l'headup. Anche se cito solo C# in questa domanda, ma in quel particolare lavoro, menziona anche VB. – Bopha

13

C# è un linguaggio, .NET è un framework applicativo. Le librerie .NET possono essere eseguite su CLR e quindi qualsiasi linguaggio che può essere eseguito su CLR può anche utilizzare le librerie .NET.

Se si ha familiarità con Java, questo è simile ... Java è un linguaggio costruito sulla JVM ... anche se una qualsiasi delle librerie Java preassemblate può essere utilizzata da un'altra lingua costruita sulla parte superiore della JVM. JVM.

+0

cosa si intende per 'CLR'? –

+1

Common Language Runtime –

24

C# è un forte linguaggio di programmazione orientato agli oggetti che è per lo più basato sul framework .NET.

C# è l'aereo e .NET è la pista;)

3

C# non hai una libreria di runtime separato. Utilizza .NET come libreria di runtime.

+0

Si intende l'implementazione di Microsoft di C#. – niagr

+0

Sì. Non ho idea di altre implementazioni. – Jude

+0

Come ha detto Andrew Hare nella sua risposta, Mono C# – Vort3x

7

Quando le persone parlano del ".net framework" tendono a combinare due aree principali: la libreria di runtime e la macchina virtuale che esegue effettivamente il codice .net.

Quando si crea una libreria di classi in Visual Studio in C#, la DLL segue un formato prescritto - molto approssimativamente, c'è una sezione che contiene metadati che descrive quali classi sono incluse in esso e quali funzioni hanno, ecc. e questo descrive dove nel binario esistono quegli oggetti. Questo formato .net comune è ciò che consente alle librerie di essere condivise tra le lingue .net (C#, VB.Net, F # e altre) facilmente. Sebbene gran parte della "libreria di runtime" .net sia scritta in C# ora (credo), potete immaginare quanti di essi avrebbero potuto essere scritti in lingue non gestite, ma disposti in questo formato prescritto in modo che potessero essere consumati dalle lingue .net .

La vera "carne" della libreria che si crea consiste in CIL ("Common Intermediate Language") che è un po 'come il linguaggio assembly di .net - di nuovo, questa lingua è l'output comune di tutte le lingue .net , che è ciò che rende le librerie .net consumabili da qualsiasi linguaggio .net.

Utilizzando lo strumento "ildasm.exe", che è disponibile gratuitamente in Microsoft SDK (e potrebbe già essere sul computer), è possibile vedere come il codice C# viene convertito in metadati e IL. Ho incluso un esempio in fondo a questa risposta come esempio.

Quando si esegue il codice .net eseguibile, ciò che accade comunemente è che la macchina virtuale .net sta leggendo quell'IL e l'elaborazione. Questo è l'altro lato di .net e, di nuovo, è probabile che si possa immaginare che questo possa essere facilmente scritto in un linguaggio non gestito: "solo" ha bisogno di leggere le istruzioni VM ed eseguirle (e integrarsi con il garbage collector, che necessita anche non essere .net code).

Quello che ho descritto è (ancora, più o meno) cosa succede quando si costruisce un eseguibile in Visual Studio (per ulteriori informazioni, consiglio vivamente il libro "CLR via C# di Jeffrey Richter" - è molto dettagliato e ottimamente scritto).

Tuttavia, ci sono momenti in cui è possibile scrivere C# che non verrà eseguito all'interno di un ambiente .net, ad esempio, Bridge.NET "compila" il codice C# in JavaScript che viene quindi eseguito nel browser (il team che lo produce ha andato allo sforzo di scrivere versioni della libreria di runtime .net che sono scritte in JavaScript e quindi la potenza e la flessibilità della libreria .net è disponibile per il codice JavaScript generato). Questo è un perfetto esempio della separazione tra C# e .net - è possibile scrivere C# per diversi "target"; si può scegliere come target l'ambiente di runtime .net (quando si costruisce un eseguibile) o si può scegliere come target l'ambiente del browser (quando si usa Bridge.NET).

A (molto) semplice classe di esempio:

using System; 

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

i meta-dati risultanti e IL (recuperato tramite 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 

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

Qui mi hai fornito un link dove spiegare che cosa è del linguaggio C# e la .NET Framework Platform Architecture. Ricorda che C# è un linguaggio di programmazione generico orientato agli oggetti e viene eseguito su .NET Framework.

.NET Framework include una libreria di classi elevate denominata Framework Class Library (FCL) e fornisce interfaccia utente, accesso ai dati, connettività di database, crittografia, sviluppo di applicazioni Web, algoritmi numerici e comunicazioni di rete.

.NET Framework è stato sviluppato da Microsoft e viene eseguito principalmente su Microsoft Windows.

Introduction to the C# Language and the .NET Framework

1

C# è un linguaggio di programmazione.

. Net è un framework utilizzato per la creazione di applicazioni su Windows.

.Net framework non è limitato a C#. Lingue diverse possono indirizzare il framework .Net e creare applicazioni utilizzando tale framework. Esempi sono F # o VB.Net

Problemi correlati