¿Cuál es la diferencia entre C # y .NET?

204

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

Bopha
fuente
41
Puedo explicar los requisitos de publicación ... Están escritos por desarrolladores que no son .NET. Ya sea gente de recursos humanos o gerencia que NO NECESITA entender la distinción.
David
2
Tienes toda la razón, debería saber entre los dos. He estado usando C # durante bastante tiempo y siempre uso la clase de biblioteca .Net cuando codifico C #, pero nunca me tomo el tiempo para diferenciarlos. Pero ahora lo sé, gracias ...
Bopha

Respuestas:

128

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

  • .NET no es solo 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 objeto de C # corresponde al modelo de objeto de .NET y puede hacer algo interesante en C # simplemente usando bibliotecas de .NET). Lo contrario no es necesariamente cierto, ya que puede usar otros lenguajes para escribir aplicaciones .NET.

La distinción entre un lenguaje , 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 de C # dice muy poco sobre el entorno (básicamente, que debería contener algunos tipos como int, pero eso es más o menos todo).

Tomás Petricek
fuente
197

C # es un lenguaje de programación, .NET es un término general que tiende a cubrir tanto .NET Framework (una biblioteca de framework de aplicaciones) 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 .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í hay una clase escrita en C #:

class Example { }

Aquí hay una clase escrita en C # que usa explícitamente un ensamblado, tipo y método de marco .NET:

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

Como mencioné antes, es muy difícil usar la implementación de C # de Microsoft sin usar también el marco .NET. Mi primera Exampleimplementación anterior incluso usa el marco .NET (implícitamente, sí, pero de todos modos lo usa) porque Examplehereda de System.Object.

Además, la razón por la que uso la frase La implementación de C # de Microsoft es porque hay otras implementaciones de C # disponibles .

Andrew Hare
fuente
3
@Tejs: en realidad, VB.NET es .NET. VB no lo es.
Eric Mickelsen
+1 Andrew Hare. @Tejs: Tanto C # como VB están muy integrados en .NET, no es .NET. .NET es un marco. Por ejemplo, puedes hacer .NET en Delphi. Si C # es .NET, entonces podría codificar C # en Delphi .NET, lo que claramente no es factible e incluso inconcebible.
Will Marcouiller
Del mismo modo, no hay ninguna razón por la que deba tener .NET para programar en C #, aunque no conozco a nadie que escriba C # sin .NET o Mono.
David Thornley
.NET CLR tiene que ver con los tipos. Para admitir múltiples idiomas, se les ocurrió CTS: sistema de tipos común que define cómo se deben definir los tipos y las reglas que los gobiernan, por ejemplo, herencia, vida útil del objeto, etc. C ++ / CLI, C #, VB son todos los idiomas que se ajustan a estos tipos (usted podría violar esto pero no voy a entrar en eso). Independientemente del lenguaje que use para construir el tipo, el comportamiento será el mismo cuando lo ejecute .NET CLR. Por lo tanto, el lenguaje y .NET pueden evolucionar por separado, aunque existe una conexión a través del CTS. VS2012, por ejemplo, no es compatible con el compilador C # 6 pero funciona con .NET 4.6
Frank Q.
55

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

Heisenberg
fuente
50

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

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

Fareevar
fuente
16

C # es un lenguaje, .NET es un marco de aplicación. Las bibliotecas .NET pueden ejecutarse 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 preensambladas de Java puede ser utilizada por otro lenguaje construido sobre la JVM.

Polaris878
fuente
¿Qué se entiende por CLR?
Kasun Siyambalapitiya
2
Common Language Runtime
Yahya-Imam Munir
1
@KasunSiyambalapitiya CLR utilizado para convertir código a código nativo Quiero decir que escribe un código c # la conversión será así C # => CLR => Código nativo. Luego ejecutará todas las plataformas como Linux o Windows
logeshpalani98
10

Cuando las personas hablan sobre el "marco .net", tienden a combinar 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, más o menos, hay una sección que contiene metadatos que describen qué clases se incluyen y qué funciones tienen, etc. y que describe dónde en el binario existen esos objetos. Este formato .net común es lo que permite compartir bibliotecas entre los idiomas .net (C #, VB.Net, F # y otros) fácilmente. Aunque gran parte de la "biblioteca de tiempo de ejecución" .net está escrita en C # ahora (creo), se puede imaginar cuántos de ellos podrían haberse escrito en idiomas no administrados pero dispuestos en este formato prescrito para que puedan ser consumidos por los idiomas .net .

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

Con la herramienta "ildasm.exe", que está disponible gratuitamente en los SDK de Microsoft (y puede que ya esté en su computadora), puede ver cómo el código C # se convierte en metadatos e IL. Incluí una muestra al final de esta respuesta como ejemplo.

Cuando ejecuta ejecutar el código .net, lo que sucede comúnmente es que la máquina virtual .net está leyendo esa IL y la está procesando. Este es el otro lado de .net y, nuevamente, es probable que pueda imaginar que esto podría escribirse fácilmente en un lenguaje no administrado: "solo" necesita leer las instrucciones de VM y ejecutarlas (e integrarse con el recolector de basura, que también necesita no ser código .net).

Lo que he descrito es (de nuevo, más o menos) lo que sucede cuando compila un ejecutable en Visual Studio (para obtener más información, recomiendo encarecidamente el libro "CLR a través de C # de Jeffrey Richter", es muy detallado y está excelentemente escrito).

Sin embargo, hay veces que puede escribir C # que no se ejecutará dentro de un entorno .net, por ejemplo, Bridge.NET "compila" el código C # en JavaScript, que luego se ejecuta en el navegador (el equipo que lo produce ha ido a el esfuerzo de escribir versiones de la biblioteca de tiempo de ejecución .net que están escritas en JavaScript y, por lo tanto, el poder y la flexibilidad de la biblioteca .net está disponible 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 .net (cuando crea un ejecutable) o puede orientar el entorno del navegador (cuando usa Bridge.NET).

Una clase de ejemplo (muy) simple:

using System;

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

Los metadatos e IL resultantes (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

// =============================================================
Dan Roberts
fuente
8

En .NET no encuentras solo C #. Puede encontrar Visual Basic por ejemplo. Si un trabajo requiere conocimiento de .NET, probablemente necesite un programador que conozca todo el conjunto de lenguajes provistos por el marco .NET.

Maurizio Reginelli
fuente
1
tienes toda la razón y gracias por el headup. Aunque solo menciono C # en esta pregunta, pero en esa publicación de trabajo en particular, también menciona VB ..
Bopha
5

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 a .Net framework y construir aplicaciones usando ese framework. Los ejemplos son F # o VB.Net

Sonevol
fuente
4

C#no tiene una biblioteca de tiempo de ejecución separada. Se utiliza .NETcomo biblioteca de tiempo de ejecución.

Judas
fuente
Te refieres a la implementación de Microsoft de c #.
Nishant George Agrwal
Si. No tengo idea de otras implementaciones.
Jude
Como Andrew Hare mencionó en su respuesta, Mono c #
Vort3x
3

Aquí le proporcioné un enlace donde explica qué es el lenguaje C # y la arquitectura de la plataforma .NET Framework . Recuerde que C # es un lenguaje de programación orientado a objetos de uso general y se ejecuta en .NET Framework.

.NET Framework incluye una biblioteca de clase grande 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.

Introducción al lenguaje C # y .NET Framework de Microsoft Docs

S. Mayol
fuente