Quelle est la différence entre C # et .NET?

204

Puis-je savoir quelle est la différence entre C # et .NET? Quand je pense à C #, je dirais tout de suite que c'est un langage .NET, mais quand je recherche des postes, ils demandent aux candidats d'avoir une expérience C # et .NET. Quelqu'un peut-il me donner une explication?

Bopha
la source
41
Je peux expliquer les publications des exigences ... Elles sont écrites par des développeurs non-NET. Soit les gens des RH ou de la direction qui n'ont PAS BESOIN de comprendre la distinction.
David
2
Vous avez absolument raison, je devrais savoir entre les deux. J'utilise C # depuis un certain temps maintenant et utilise toujours la classe de bibliothèque .Net lors du codage C # mais ne prends jamais de temps pour faire la différence entre les deux. Mais maintenant je sais, merci ..
Bopha

Réponses:

128

En plus de ce qu'a dit Andrew, il convient de noter que:

  • .NET n'est pas seulement une bibliothèque , mais aussi un runtime pour exécuter des applications.
  • La connaissance de C # implique une certaine connaissance de .NET (car le modèle d'objet C # correspond au modèle d'objet .NET et vous pouvez faire quelque chose d'intéressant en C # simplement en utilisant des bibliothèques .NET). L'inverse n'est pas nécessairement vrai car vous pouvez utiliser d'autres langues pour écrire des applications .NET.

La distinction entre un langage , un runtime et une bibliothèque est plus stricte en .NET / C # que par exemple en C ++, où la spécification du langage inclut également certaines fonctions de bibliothèque de base. La spécification C # ne dit que très peu de choses sur l'environnement (fondamentalement, il devrait contenir certains types tels que int, mais c'est plus ou moins tout).

Tomas Petricek
la source
197

C # est un langage de programmation, .NET est un terme générique qui a tendance à couvrir à la fois le .NET Framework (une bibliothèque de framework d'application) et le Common Language Runtime qui est le runtime dans lequel les assemblys .NET sont exécutés.

L'implémentation de C # par Microsoft est fortement intégrée au .NET Framework, il est donc compréhensible que les deux concepts soient confondus. Cependant, il est important de comprendre que ce sont deux choses très différentes.

Voici une classe écrite en C #:

class Example { }

Voici une classe écrite en C # qui utilise explicitement un assembly, un type et une méthode de framework .NET:

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

Comme je l'ai mentionné précédemment, il est très difficile d'utiliser l'implémentation Microsoft de C # sans utiliser également le framework .NET. Ma première Exampleimplémentation ci-dessus utilise même le framework .NET (implicitement oui, mais il l'utilise quand même) car Examplehérite de System.Object.

En outre, la raison pour laquelle j'utilise l'expression Microsoft implémentation de C # est parce qu'il existe d' autres implémentations de C # disponibles .

Andrew Hare
la source
3
@Tejs - En fait, VB.NET est .NET. VB ne l'est pas.
Eric Mickelsen
+1 Andrew Hare. @Tejs: C # et VB sont fortement intégrés à .NET, ce n'est pas .NET. .NET est un framework. Selon l'instance, vous pouvez faire .NET dans Delphi. Si C # est .NET, alors vous seriez en mesure de coder C # dans Delphi .NET, ce qui n'est clairement pas faisable et même inconcevable.
Will Marcouiller
De même, il n'y a aucune raison pour que vous ayez besoin de .NET pour programmer en C #, bien que je ne connaisse personne qui écrit en C # sans .NET ou Mono.
David Thornley
.NET CLR est tout au sujet des types. Afin de prendre en charge plusieurs langages, ils ont proposé CTS - Système de type commun qui définit la façon dont les types doivent être définis et les règles qui les régissent, par exemple l'héritage, la durée de vie des objets, etc. C ++ / CLI, C #, VB sont tous des langages conformes à ces types (vous pourrait en violer cela mais je ne vais pas y entrer). Quel que soit le langage utilisé pour construire le type, le comportement sera le même lorsqu'il sera exécuté par .NET CLR. Par conséquent, le langage et .NET peuvent évoluer séparément bien qu'il y ait une connexion via le CTS. VS2012, par exemple, ne prend pas en charge le compilateur C # 6 mais fonctionne avec .NET 4.6
Frank Q.
55

C # est un langage de programmation, .NET est le framework sur lequel le langage est construit.

heisenberg
la source
50

C # est un langage de programmation orienté objet puissant qui est principalement construit sur le framework .NET.

C # est l'avion et .NET est la piste;)

Fareevar
la source
16

C # est un langage, .NET est un cadre d'application. Les bibliothèques .NET peuvent s'exécuter sur le CLR et donc tout langage pouvant s'exécuter sur le CLR peut également utiliser les bibliothèques .NET.

Si vous connaissez Java, c'est similaire ... Java est un langage construit au-dessus de la JVM ... bien que n'importe laquelle des bibliothèques Java pré-assemblées puisse être utilisée par un autre langage construit au-dessus de la JVM.

Polaris878
la source
que veut-on dire CLR?
Kasun Siyambalapitiya
2
Common Language Runtime
Yahya-Imam Munir
1
@KasunSiyambalapitiya CLR utilisé pour convertir en code en code natif Je veux dire que vous écrivez un code c # la conversion sera comme ceci C # => CLR => Code natif. Ensuite, il exécutera toutes les plates-formes comme Linux ou Windows
logeshpalani98
10

Lorsque les gens parlent du «framework .net», ils ont tendance à combiner deux domaines principaux - la bibliothèque d'exécution et la machine virtuelle qui exécute réellement le code .net.

Lorsque vous créez une bibliothèque de classes dans Visual Studio en C #, la DLL suit un format prescrit - très approximativement, il y a une section qui contient des métadonnées qui décrit les classes qui y sont incluses et quelles fonctions elles ont, etc. et qui décrit où dans le binaire, ces objets existent. Ce format .net commun est ce qui permet aux bibliothèques d'être partagées entre les langages .net (C #, VB.Net, F # et autres) facilement. Bien qu'une grande partie de la «bibliothèque d'exécution» .net soit écrite en C # maintenant (je crois), vous pouvez imaginer combien d'entre elles auraient pu être écrites dans des langues non gérées mais disposées dans ce format prescrit afin qu'elles puissent être consommées par les langues .net .

La véritable "viande" de la bibliothèque que vous créez est constituée de CIL ("Common Intermediate Language") qui est un peu comme le langage d'assemblage de .net - encore une fois, ce langage est la sortie commune de tous les langages .net, ce qui est ce que rend les bibliothèques .net consommables par n'importe quel langage .net.

En utilisant l'outil "ildasm.exe", qui est disponible gratuitement dans les SDK Microsoft (et peut-être déjà sur votre ordinateur), vous pouvez voir comment le code C # est converti en métadonnées et en IL. J'ai inclus un exemple au bas de cette réponse à titre d'exemple.

Lorsque vous exécutez exécuter du code .net, ce qui se passe généralement, c'est que la machine virtuelle .net lit cet IL et le traite. Il s'agit de l'autre côté de .net et, encore une fois, vous pouvez probablement imaginer que cela pourrait facilement être écrit dans un langage non géré - il suffit "de lire" les instructions de la machine virtuelle et de les exécuter (et de l'intégrer au garbage collector, qui a également besoin pas de code .net).

Ce que j'ai décrit est (encore une fois) ce qui se passe lorsque vous créez un exécutable dans Visual Studio (pour plus d'informations, je recommande fortement le livre "CLR via C # par Jeffrey Richter" - il est très détaillé et très bien écrit).

Cependant, il peut arriver que vous écriviez C # qui ne sera pas exécuté dans un environnement .net - par exemple, Bridge.NET "compile" le code C # en JavaScript qui est ensuite exécuté dans le navigateur (l'équipe qui le produit est passée à l'effort d'écrire des versions de la bibliothèque d'exécution .net qui sont écrites en JavaScript et ainsi la puissance et la flexibilité de la bibliothèque .net sont disponibles pour le JavaScript généré). Ceci est un parfait exemple de la séparation entre C # et .net - il est possible d'écrire C # pour différentes "cibles"; vous pouvez cibler l'environnement d'exécution .net (lorsque vous créez un exécutable) ou vous pouvez cibler l'environnement de navigateur (lorsque vous utilisez Bridge.NET).

Un exemple de classe (très) simple:

using System;

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

Les métadonnées et IL résultants (récupérés via 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
la source
8

Dans .NET, vous ne trouvez pas uniquement C #. Vous pouvez trouver Visual Basic par exemple. Si un travail nécessite des connaissances .NET, il a probablement besoin d'un programmeur qui connaît l'ensemble des langages fournis par le framework .NET.

Maurizio Reginelli
la source
1
vous avez absolument raison et merci pour le headup. Bien que je ne mentionne que C # dans cette question, mais dans ce poste particulier, il mentionne également VB ..
Bopha
5

C # est un langage de programmation.

.Net est un framework utilisé pour créer des applications sur Windows.

Le framework .Net n'est pas limité à C #. Différentes langues peuvent cibler le framework .Net et créer des applications à l'aide de ce framework. Les exemples sont F # ou VB.Net

Sonevol
la source
4

C#n'a pas de bibliothèque d'exécution distincte. Il utilise .NETcomme une bibliothèque d'exécution.

Jude
la source
Vous voulez dire l'implémentation de c # par Microsoft.
Nishant George Agrwal
Oui. Je n'ai aucune idée des autres implémentations.
Jude
Comme Andrew Hare l'a mentionné dans sa réponse, Mono c #
Vort3x
3

Ici, je vous ai fourni un lien où expliquer ce qu'est le langage C # et l' architecture de la plate-forme .NET Framework . N'oubliez pas que C # est un langage de programmation polyvalent, orienté objet, et qu'il s'exécute sur le .NET Framework.

.NET Framework comprend une grande bibliothèque de classes nommée Framework Class Library (FCL) et fournit une interface utilisateur, un accès aux données, une connectivité à la base de données, une cryptographie, le développement d'applications Web, des algorithmes numériques et des communications réseau.

.NET Framework a été développé par Microsoft et fonctionne principalement sur Microsoft Windows.

Introduction au langage C # et au .NET Framework à partir de Microsoft Docs

S. Mayol
la source