Jaka jest różnica między C # a .NET?


204

Czy mogę wiedzieć, jaka jest różnica między C # a .NET? Kiedy myślę o C #, od razu powiedziałbym, że jest to język .NET, ale kiedy szukam ofert pracy, wymagają od kandydatów doświadczenia w C # i .NET. Czy ktoś może mi wyjaśnić?


41
Mogę wyjaśnić publikowane wymagania ... Są napisane przez programistów spoza platformy .NET. Zarówno HR, jak i kadra kierownicza, którzy NIE POTRZEBUJĄ zrozumienia tego rozróżnienia.
David

2
Masz absolutną rację, powinienem wiedzieć między nimi. Używam C # od dłuższego czasu i zawsze używam klasy biblioteki .Net podczas kodowania C #, ale nigdy nie potrzebuję czasu na rozróżnienie między nimi. Ale teraz wiem, dzięki ..
Bopha

Odpowiedzi:


128

Oprócz tego, co powiedział Andrew, warto zauważyć, że:

  • .NET to nie tylko biblioteka , ale także środowisko wykonawcze do uruchamiania aplikacji.
  • Znajomość C # implikuje pewną znajomość .NET (ponieważ model obiektowy C # odpowiada modelowi obiektowemu .NET i możesz zrobić coś ciekawego w C # tylko przy użyciu bibliotek .NET). Przeciwnie, niekoniecznie musi to być prawda, ponieważ możesz używać innych języków do pisania aplikacji .NET.

Różnica między językiem , środowiskiem wykonawczym a biblioteką jest bardziej rygorystyczna w .NET / C # niż na przykład w C ++, gdzie specyfikacja języka obejmuje również niektóre podstawowe funkcje biblioteczne. Specyfikacja C # mówi bardzo niewiele o środowisku (w zasadzie, że powinno zawierać pewne typy, takie jak int, ale to mniej więcej wszystko).


197

C # to język programowania, .NET to ogólny termin obejmujący zarówno .NET Framework (bibliotekę aplikacji), jak i Common Language Runtime, czyli środowisko wykonawcze, w którym uruchamiane są zestawy .NET.

Implementacja C # przez Microsoft jest mocno zintegrowana z .NET Framework, więc zrozumiałe jest, że te dwie koncepcje byłyby mylone. Jednak ważne jest, aby zrozumieć, że są to dwie bardzo różne rzeczy.

Oto klasa napisana w C #:

class Example { }

Oto klasa napisana w języku C #, która jawnie używa zestawu, typu i metody środowiska .NET:

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

Jak wspomniałem wcześniej, bardzo trudno jest używać implementacji C # przez Microsoft bez korzystania z platformy .NET. Moja pierwsza Exampleimplementacja powyżej używa nawet .NET Framework (domyślnie tak, ale mimo to go używa), ponieważ Exampledziedziczy po System.Object.

Powodem, dla którego używam wyrażenia implementacji C # przez Microsoft jest to, że dostępne są inne implementacje C # .


3
@Tejs - W rzeczywistości VB.NET to .NET. VB nie jest.
Eric Mickelsen

+1 Andrew Hare. @Tejs: Zarówno C #, jak i VB są mocno zintegrowane z .NET, to nie jest .NET. .NET to framework. Na przykład, możesz zrobić .NET w Delphi. Jeśli C # to .NET, to możesz kodować C # w Delphi .NET, co oczywiście nie jest wykonalne, a nawet nie do pomyślenia.
Will Marcouiller,

Podobnie, nie ma powodu, dla którego musisz mieć .NET do programowania w C #, chociaż nie znam nikogo, kto pisze C # bez .NET lub Mono.
David Thornley,

.NET CLR to przede wszystkim typy. Aby obsługiwać wiele języków, wymyślili CTS - wspólny system typów, który definiuje sposób definiowania typów i zasady rządzące nimi, np. Dziedziczenie, czas życia obiektu itp. C ++ / CLI, C #, VB są językami zgodnymi z tymi typami (ty może to naruszyć, ale nie będę się w to angażować). Bez względu na to, jakiego języka użyjesz do zbudowania typu, zachowanie będzie takie samo, gdy zostanie wykonane przez .NET CLR. Dlatego język i .NET mogą ewoluować osobno, chociaż istnieje połączenie za pośrednictwem CTS. VS2012 np. Nie obsługuje kompilatora C # 6, ale współpracuje z .NET 4.6
Frank Q.

55

C # to język programowania, .NET to platforma, na której język jest zbudowany.


49

C # jest silnym językiem programowania obiektowego, zbudowanym głównie na platformie .NET.

C # to samolot, a .NET to pas startowy;)


15

C # to język, a .NET to środowisko aplikacji. Biblioteki .NET mogą działać na CLR, a zatem każdy język, który może działać na CLR, może również korzystać z bibliotek .NET.

Jeśli znasz Javy, jest to podobne ... Java jest językiem zbudowanym na JVM ... chociaż dowolna z gotowych bibliotek Java może być używana w innym języku zbudowanym na JVM.


Co to znaczy CLR?
Kasun Siyambalapitiya

2
Środowisko uruchomieniowe języka wspólnego
Yahya-Imam Munir,

1
@KasunSiyambalapitiya CLR używany do konwersji na kod na kod macierzysty Mam na myśli, że piszesz kod c # konwersja będzie taka jak C # => CLR => Kod macierzysty. Wtedy będzie działał na wszystkich platformach, takich jak Linux lub Windows
logeshpalani98

10

Kiedy ludzie mówią o „frameworku .net”, zwykle łączą dwa główne obszary - bibliotekę wykonawczą i maszynę wirtualną, która faktycznie uruchamia kod .net.

Kiedy tworzysz bibliotekę klas w Visual Studio w C #, biblioteka DLL ma określony format - bardzo z grubsza, jest sekcja, która zawiera metadane, które opisują, jakie klasy są w niej zawarte i jakie mają funkcje itp. I opisują gdzie w systemie binarnym te obiekty istnieją. Ten wspólny format .net umożliwia łatwe udostępnianie bibliotek między językami .net (C #, VB.Net, F # i innymi). Chociaż większość „biblioteki wykonawczej” .net jest teraz napisana w C # (wierzę), możesz sobie wyobrazić, ile z nich mogło być napisanych w niezarządzanych językach, ale ułożonych w tym przepisanym formacie, aby mogły być używane przez języki .net .

Prawdziwe „mięso” biblioteki, którą budujesz, składa się z CIL („Common Intermediate Language”), który jest trochę podobny do języka asemblera .net - znowu ten język jest wspólnym wyjściem wszystkich języków .net, co jest tym, co sprawia, że ​​biblioteki .net mogą być używane przez dowolny język .net.

Korzystając z narzędzia „ildasm.exe”, które jest bezpłatnie dostępne w zestawach Microsoft SDK (i może już być na komputerze), możesz zobaczyć, jak kod C # jest konwertowany na metadane i IL. Podałem próbkę na dole tej odpowiedzi jako przykład.

Po uruchomieniu kodu .net często zdarza się, że maszyna wirtualna .net odczytuje tę IL i przetwarza ją. To jest druga strona .net i znowu możesz sobie wyobrazić, że można to łatwo napisać w niezarządzanym języku - „tylko” musi przeczytać instrukcje VM i je uruchomić (i zintegrować się z modułem śmieciowym, który również potrzebuje nie być kodem .net).

To, co opisałem, to (z grubsza) to, co dzieje się, gdy budujesz plik wykonywalny w Visual Studio (aby uzyskać więcej informacji, bardzo polecam książkę „CLR przez C # Jeffreya Richtera” - jest bardzo szczegółowa i doskonale napisana).

Jednak zdarza się, że możesz napisać C #, który nie będzie wykonywany w środowisku .net - na przykład Bridge.NET „kompiluje” kod C # do JavaScript, który jest następnie uruchamiany w przeglądarce (zespół, który go tworzy, przeszedł do wysiłek pisania wersji biblioteki wykonawczej .net, które są napisane w JavaScript, więc moc i elastyczność biblioteki .net jest dostępna dla wygenerowanego JavaScript). Jest to doskonały przykład separacji między C # a .net - można napisać C # dla różnych „celów”; możesz celować w środowisko wykonawcze .net (podczas budowania pliku wykonywalnego) lub w środowisko przeglądarki (podczas korzystania z Bridge.NET).

(Bardzo) prosta przykładowa klasa:

using System;

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

Wynikowe metadane i IL (pobrane przez 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

// =============================================================

8

W .NET nie znajdziesz tylko C #. Na przykład możesz znaleźć Visual Basic. Jeśli zadanie wymaga znajomości platformy .NET, prawdopodobnie potrzebuje programisty znającego cały zestaw języków dostarczanych przez platformę .NET.


1
masz absolutną rację i dziękuję za awans. Chociaż wspominam tylko C # w tym pytaniu, ale na tym konkretnym stanowisku, wspomina również VB ..
Bopha

5

C # to język programowania.

.Net to platforma używana do budowania aplikacji w systemie Windows.

.NET Framework nie jest ograniczony do C #. Różne języki mogą być kierowane na platformę .Net i budować aplikacje przy użyciu tej platformy. Przykładami są F # lub VB.Net


4

C#nie ma oddzielnej biblioteki wykonawczej. Używa .NETjako biblioteki wykonawczej.


Masz na myśli implementację c # przez Microsoft.
Nishant George Agrwal

Tak. Nie mam pojęcia o innych implementacjach.
Juda

Jak wspomniał Andrew Hare w swojej odpowiedzi, Mono c #
Vort3x

3

Tutaj podałem ci link, w którym wyjaśnisz, czym jest język C # i architektura platformy .NET Framework . Pamiętaj, że C # jest uniwersalnym, obiektowym językiem programowania i działa na platformie .NET Framework.

.NET Framework zawiera dużą bibliotekę klas o nazwie Framework Class Library (FCL) i zapewnia interfejs użytkownika, dostęp do danych, łączność z bazą danych, kryptografię, tworzenie aplikacji internetowych, algorytmy numeryczne i komunikację sieciową.

.NET Framework został opracowany przez Microsoft, który działa głównie w systemie Microsoft Windows.

Wprowadzenie do języka C # i .NET Framework z Microsoft Docs

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.