Яка різниця між C # і .NET?


204

Чи можу я знати, яка різниця між C # і .NET? Коли я думаю про C #, одразу я б сказав, що це мова .NET, але коли я шукаю посади, вони вимагають, щоб кандидати мали досвід C # та .NET. Може хтось дасть мені пояснення?


41
Я можу пояснити публікації вимог ... Вони написані розробниками, які не є .NET. Або HR, або керівники, яким НЕ ПОТРІБНО зрозуміти відмінність.
Девід

2
Ви абсолютно праві, я повинен знати між ними. Я використовую C # вже досить давно і завжди використовую .Net клас бібліотеки при кодуванні C #, але ніколи не знаходжу часу для розмежування двох. Але тепер я знаю, дякую ..
Бофа

Відповіді:


128

Крім того, що сказав Андрій, варто зазначити, що:

  • .NET - це не лише бібліотека , а й час виконання програм.
  • Знання C # означає деяке знання .NET (тому що об'єктна модель C # відповідає об'єктній моделі .NET, і ви можете зробити щось цікаве в C # просто за допомогою бібліотек .NET). Протилежне не обов'язково, оскільки ви можете використовувати інші мови для написання програм .NET.

Відмінність між мовою , часом виконання та бібліотекою є більш суворим у .NET / C #, ніж, наприклад, у C ++, де специфікація мови також включає деякі основні функції бібліотеки. Специфікація C # говорить дуже мало про навколишнє середовище (в основному, що вона повинна містити такі типи, як int, але це більш-менш все).


197

C # - мова програмування, .NET - це простір, який охоплює як .NET Framework (бібліотека фреймворків додатків), так і загальну мову виконання, яка є часом виконання, в якому запускаються збірки .NET.

Майкрософт впроваджує C # сильно інтегрований із .NET Framework, тому зрозуміло, що ці дві концепції будуть плутані. Однак важливо розуміти, що це дві дуже різні речі.

Ось клас, написаний на C #:

class Example { }

Ось клас, написаний на C #, який явно використовує збірку, тип та метод .NET Framework:

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

Як я вже згадував раніше, дуже важко використовувати впровадження C # від Microsoft, не використовуючи також .NET Framework. Моя перша Exampleреалізація вище навіть використовує .NET-фреймворк (неявно, так, але він все-таки використовує його), оскільки Exampleпередає у спадок System.Object.

Крім того, я використовую фразу впровадження C # від Microsoft в тому, що існують інші реалізації C # .


3
@Tejs - Власне, VB.NET - це .NET. VB - ні.
Ерік Мікельсен

+1 Ендрю Заєць. @Tejs: І C #, і VB сильно інтегровані в .NET, це не .NET. .NET - це рамка. Як, наприклад, ви можете зробити .NET в Delphi. Якщо C # є .NET, то ви зможете кодувати C # в Delphi .NET, що явно не підлягає виконанню і навіть немислиме.
Буде Маркуйлер

Так само немає жодної причини, щоб у вас не було .NET для програмування на C #, хоча я не знаю нікого, хто пише C # без .NET чи Mono.
Девід Торнлі

.NET CLR - все про типи. Для підтримки декількох мов вони розробили CTS - загальну систему типів, яка визначає, як слід визначати типи та правила, що керують ними, наприклад, успадкування, термін експлуатації об'єкта тощо. C ++ / CLI, C #, VB - всі мови, що відповідають цим типам (ви міг би порушити це, але я не хочу в нього потрапляти). . Незалежно від того, яку мову ви використовуєте для побудови типу, поведінка буде однаковою при виконанні .NET CLR. Отже, мова та .NET можуть розвиватися окремо, хоча є з'єднання через CTS. VS2012, наприклад, не підтримує компілятор C # 6, але працює з .NET 4.6
Frank Q.


49

C # - це сильна об'єктно-орієнтована мова програмування, яка здебільшого побудована на основі .NET.

C # - літак, а .NET - злітно-посадкова смуга;)


15

C # - це мова. Бібліотеки .NET можуть працювати на CLR, і тому будь-яка мова, яка може працювати в CLR, також може використовувати бібліотеки .NET.

Якщо ви знайомі з Java, це схоже ... Java - це мова, побудована на версії JVM ... хоча будь-яка з попередньо зібраних бібліотек Java може використовуватися іншою мовою, побудованою поверх JVM.


що означає CLR?
Kasun Siyambalapitiya

2
Загальне мовне виконання
Ях'я-імам Мунір

1
@KasunSiyambalapitiya CLR використовується для перетворення коду в рідний код. Я маю на увазі, що ви пишете код c # перетворення буде таким, як C # => CLR => Рідний код. Тоді він запустить усі платформи на зразок linux чи Windows
logeshpalani98

10

Коли люди говорять про ".net Framework", вони, як правило, поєднують дві основні області - бібліотеку часу виконання і віртуальну машину, яка фактично працює з кодом .net.

Коли ви створюєте бібліотеку класів у Visual Studio в C #, DLL дотримується встановленого формату - дуже орієнтовно, є розділ, який містить метадані, що описують, які класи входять до нього та які функції у них є, тощо. у двійковому ті об'єкти існують. Цей поширений формат .net дозволяє легко обмінюватися бібліотеками між мовами .net (C #, VB.Net, F # та іншими). Хоча значна частина .net "бібліотеки виконання" написана на C # зараз (я вважаю), ви можете уявити, скільки з них могло бути написано некерованими мовами, але влаштовано у встановленому форматі, щоб вони могли споживатися .net мовами .

Справжнє "м'ясо" бібліотеки, яку ви будуєте, складається з CIL ("загальної проміжної мови"), яка трохи схожа на мову складання .net - знову ж таки, ця мова є загальним виведенням усіх мов .net, ось що робить бібліотеки .net споживчими будь-якою мовою .net.

Використовуючи інструмент "ildasm.exe", який є у вільному доступі в SDK Microsoft (і, можливо, вже є на вашому комп'ютері), ви можете бачити, як код C # перетворюється в метадані та IL. Я включив зразок внизу цієї відповіді як приклад.

Під час запуску .net-коду зазвичай відбувається, що віртуальна машина .net читає ІЛ та обробляє його. Це інша сторона .net, і, знову ж таки, ви можете, можливо, уявити, що це можна було б легко записати некерованою мовою - це "лише" потрібно прочитати інструкції VM та запустити їх (та інтегруватись зі смітником, який також потрібен не бути кодом .net).

Що я описав - це (знову ж таки, приблизно) те, що відбувається, коли ви створюєте виконуваний файл у Visual Studio (для отримання додаткової інформації, я настійно рекомендую книгу "CLR через C # від Джефрі Ріхтера" - це дуже детально та чудово написано).

Однак є випадки, коли ви можете написати C #, який не буде виконуватися в середовищі .net - наприклад, Bridge.NET "компілює" код C # в JavaScript, який потім запускається в браузері (команда, яка його виробляє, пішла в зусилля щодо написання версій бібліотеки виконання .net, які написані на JavaScript, і таким чином потужність та гнучкість бібліотеки .net доступні для створеного JavaScript). Це ідеальний приклад поділу між C # і .net - можна писати C # для різних "цілей"; ви можете орієнтуватися на середовище виконання .net (коли ви створюєте виконуваний файл) або ви можете орієнтуватися на середовище браузера (коли ви використовуєте Bridge.NET).

(Дуже) простий клас прикладу:

using System;

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

Отримані в результаті метадані та IL (отримані через 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

У .NET ви не знайдете лише C #. Ви можете знайти, наприклад, Visual Basic. Якщо робота вимагає знань .NET, ймовірно, їй потрібен програміст, який знає весь набір мов, передбачених рамкою .NET.


1
ви абсолютно праві, і дякую за резервну копію. Хоча в цьому питанні я згадую лише C #, але в цій конкретній посаді він також згадує VB ..
Бофа

5

C # - мова програмування.

.Net - це фреймворк, який використовується для створення програм у Windows.

.Net Framework не обмежується C #. Різні мови можуть орієнтуватися на .Net Framework та створювати програми, використовуючи цей фреймворк. Прикладами є F # або VB.Net


4

C#не має окремої бібліотеки виконання. Він використовується .NETяк бібліотека часу виконання.


Ви маєте на увазі впровадження Microsoft c #.
Нішант Джордж Агрвал

Так. Я не маю уявлення про інші реалізації.
Джуд

Як згадував Ендрю Заєць у своїй відповіді, Mono c #
Vort3x

3

Тут я надав вам посилання, де пояснюється, що таке мова C # та архітектура платформи .NET Framework Platform . Пам'ятайте, що C # - це об'єктно-орієнтована мова програмування загального призначення, і вона працює на .NET Framework.

.NET Framework включає велику бібліотеку класів під назвою Framework Class Library (FCL) і забезпечує користувальницький інтерфейс, доступ до даних, підключення до бази даних, криптографію, розробку веб-додатків, числові алгоритми та мережеві комунікації.

.NET Framework була розроблена корпорацією Майкрософт, яка працює в основному на Microsoft Windows.

Знайомство з мовою C # та .NET Framework від Microsoft Docs

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.