2010-04-27 569 views
119

¿Puedo saber cuál es la diferencia entre C# y .NET? Cuando pienso en C#, de inmediato diría que es un lenguaje .NET, pero cuando busco puestos de trabajo, requieren que los candidatos tengan experiencia en C# y .NET. ¿Puede alguien darme una explicación?¿Cuál es la diferencia entre C# y .NET?

+25

Puedo explicar las publicaciones de requisitos ... Están escritos por desarrolladores que no son de .NET. O personas de recursos humanos o de gestión que no NECESITAN entender la distinción. – David

+1

Tienes toda la razón, debería saber entre los dos. He estado usando C# por bastante tiempo y siempre uso la clase de biblioteca .Net cuando codifico C# pero nunca me tomo el tiempo para diferenciar entre los dos. Pero ahora lo sé, gracias .. – Bopha

Respuesta

78

Además de lo que Andrew dijo, vale la pena señalar que:

  • .NET no es sólo una biblioteca , sino también un tiempo de ejecución para ejecutar aplicaciones.
  • El conocimiento de C# implica cierto conocimiento de .NET (porque el modelo de objetos C# corresponde al modelo de objetos .NET y puede hacer algo interesante en C# simplemente utilizando bibliotecas .NET). Lo contrario no es necesariamente cierto, ya que puede usar otros idiomas para escribir aplicaciones .NET.

La distinción entre una lengua, un tiempo de ejecución, y una biblioteca es más estricta en .NET/C# que por ejemplo en C++, donde la especificación del lenguaje también incluye algunas funciones básicas de la biblioteca.La especificación C# dice muy poco sobre el medio ambiente (básicamente, debe contener algunos tipos como int, pero eso es más o menos todo).

139

C# es un lenguaje de programación, .NET es un término general que tiende a cubrir tanto .NET Framework (una biblioteca de marco de aplicación) como Common Language Runtime, que es el tiempo de ejecución en el que se ejecutan los ensamblados .NET.

La implementación de Microsoft de C# está muy integrada con el .NET Framework por lo que es comprensible que los dos conceptos se confundan. Sin embargo, es importante entender que son dos cosas muy diferentes.

Aquí es una clase escrito en C#:

class Example { } 

Aquí es una clase escrito en C# que utiliza explícitamente un conjunto de marco .NET, el tipo y método:

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

Como he mencionado antes, es muy difícil usar la implementación de C# de Microsoft sin usar el framework .NET también. Mi primera implementación Example incluso usa el framework .NET (implícitamente, sí, pero aún así lo usa) porque Example hereda de System.Object.

Además, la razón por la que uso la frase implementación de C# de Microsoft es porque hay other implementations of C# available.

+3

@Tejs - En realidad, VB.NET es .NET. VB no lo es. –

+1

Quizás la diferencia entre los dos se vuelve aún más obvia tan pronto como otros lenguajes de programación basados ​​en .NET entran en escena: hay VB.NET, F #, J #, IronPython, IronRuby, y escuché incluso que COBOL llegó a la plataforma .NET . – stakx

+0

+1 Andrew Hare. @Tejs: Tanto C# como VB están fuertemente integrados a .NET, no es .NET. .NET es un marco. Según la instancia, puedes hacer .NET en Delphi. Si C# es .NET, entonces usted podría codificar C# en Delphi .NET, lo que claramente no es factible e incluso inconcebible. –

37

C# es un lenguaje de programación, .NET es el marco en el que se basa el lenguaje.

6

En .NET usted no encuentra solamente C#. Puede encontrar Visual Basic, por ejemplo. Si un trabajo requiere conocimiento de .NET, probablemente necesite un programador que conozca todo el conjunto de idiomas proporcionados por .NET framework.

+1

tienes toda la razón y gracias por el encabezado. Aunque solo menciono C# en esta pregunta, pero en ese puesto de trabajo en particular, también menciona a VB .. – Bopha

13

C# es un lenguaje, .NET es un marco de aplicación. Las bibliotecas .NET se pueden ejecutar en el CLR y, por lo tanto, cualquier lenguaje que pueda ejecutarse en el CLR también puede usar las bibliotecas .NET.

Si está familiarizado con Java, esto es similar ... Java es un lenguaje construido sobre la JVM ... aunque cualquiera de las bibliotecas Java pre-ensambladas puede ser utilizada por otro lenguaje construido en la parte superior de la JVM.

+0

¿Qué se entiende por 'CLR'? –

+1

Common Language Runtime –

24

C# es un lenguaje de programación orientado a objetos fuerte que se construye sobre todo en el marco .NET.

C# es el avión y .NET es la pista;)

3

C# no tiene una biblioteca de tiempo de ejecución separada. Utiliza .NET como una biblioteca de tiempo de ejecución.

+0

Se refiere a la implementación de Microsoft de C#. – niagr

+0

Sí. No tengo idea de otras implementaciones. – Jude

+0

Como mencionó Andrew Hare en su respuesta, Mono C# – Vort3x

7

Cuando la gente habla de la ".net framework" que tienden a ser la combinación de dos áreas principales - la biblioteca de tiempo de ejecución y la máquina virtual que realmente ejecuta el código .NET.

Cuando crea una biblioteca de clases en Visual Studio en C#, la DLL sigue un formato prescrito; muy aproximadamente, hay una sección que contiene metadatos que describe qué clases están incluidas y qué funciones tienen, etc. y eso describe dónde existen en el binario esos objetos. Este formato .net común es lo que permite que las bibliotecas se compartan fácilmente entre los lenguajes .net (C#, VB.Net, F # y otros). Aunque gran parte del .NET "biblioteca de tiempo de ejecución" está escrito en C# ahora (creo), se puede imaginar cuántos de ellos podrían haber sido escritos en idiomas no administrados, pero dispuestos en este formato prescrito para que puedan ser consumidos por los lenguajes .NET .

La verdadera "carne" de la biblioteca que construye consiste en CIL ("Common Intermediate Language") que es un poco como el lenguaje ensamblador de .net. De nuevo, este lenguaje es el resultado común de todos los lenguajes .net , que es lo que hace que las librerías .net sean consumibles por cualquier lenguaje .net.

Utilizando la herramienta "ildasm.exe", que está disponible gratuitamente en Microsoft SDK (y puede que ya esté en su computadora), puede ver cómo el código C# se convierte en metadatos e IL. He incluido una muestra en la parte inferior de esta respuesta como un ejemplo.

Al ejecutar ejecutar código .NET, lo que comúnmente ocurre es que la máquina virtual .net es la lectura que la IL y procesarla. Esta es la otra cara de .NET y, de nuevo, es probable que se pueda imaginar que esto podría fácilmente ser escrito en un lenguaje no administrado - es "sólo" tiene que leer las instrucciones y ejecutarlas VM (e integrarse con el recolector de basura, lo que también es necesario no ser código .net).

Lo que he descrito es (nuevamente, más o menos) lo que sucede cuando construyes un ejecutable en Visual Studio (para más información, recomiendo el libro "CLR via C# by Jeffrey Richter" - es muy detallado y está excelentemente escrito)

Sin embargo, hay ocasiones en que puede escribir C# que no se ejecutará en un entorno .net; por ejemplo, Bridge.NET "compila" código C# en JavaScript y luego se ejecuta en el navegador (el equipo que lo produce tiene se han esforzado por escribir versiones de la biblioteca de tiempo de ejecución de .net escritas en JavaScript, por lo que el poder y la flexibilidad de la biblioteca .net están disponibles para el JavaScript generado). Este es un ejemplo perfecto de la separación entre C# y .net - es posible escribir C# para diferentes "objetivos"; puede orientar el entorno de tiempo de ejecución de .NET (cuando construye un archivo ejecutable) o puede orientar el entorno del navegador (cuando utiliza Bridge.NET).

A (muy) sencilla clase de ejemplo:

using System; 

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

los metadatos resultantes y IL (recuperados a través de 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

Aquí les proporciona un enlace donde explica qué es del lenguaje C# y la .NET Framework Plataforma Arquitectura. Recuerde que C# es un lenguaje de programación orientado a objetos de propósito general y se ejecuta en .NET Framework.

.NET Framework incluye una gran biblioteca de clases llamada Framework Class Library (FCL) y proporciona interfaz de usuario, acceso a datos, conectividad de base de datos, criptografía, desarrollo de aplicaciones web, algoritmos numéricos y comunicaciones de red.

.NET Framework fue desarrollado por Microsoft que se ejecuta principalmente en Microsoft Windows.

Introduction to the C# Language and the .NET Framework

1

C# es un lenguaje de programación.

.Net es un marco utilizado para crear aplicaciones en Windows.

.Net framework no está limitado a C#. Diferentes lenguajes pueden apuntar al framework .Net y construir aplicaciones usando ese framework. Los ejemplos son F # o VB.Net

Cuestiones relacionadas