Чи можу я знати, яка різниця між C # і .NET? Коли я думаю про C #, одразу я б сказав, що це мова .NET, але коли я шукаю посади, вони вимагають, щоб кандидати мали досвід C # та .NET. Може хтось дасть мені пояснення?
Чи можу я знати, яка різниця між C # і .NET? Коли я думаю про C #, одразу я б сказав, що це мова .NET, але коли я шукаю посади, вони вимагають, щоб кандидати мали досвід C # та .NET. Може хтось дасть мені пояснення?
Відповіді:
Крім того, що сказав Андрій, варто зазначити, що:
Відмінність між мовою , часом виконання та бібліотекою є більш суворим у .NET / C #, ніж, наприклад, у C ++, де специфікація мови також включає деякі основні функції бібліотеки. Специфікація C # говорить дуже мало про навколишнє середовище (в основному, що вона повинна містити такі типи, як int
, але це більш-менш все).
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 # .
C # - мова програмування, .NET - це структура, на якій побудована мова.
C # - це мова. Бібліотеки .NET можуть працювати на CLR, і тому будь-яка мова, яка може працювати в CLR, також може використовувати бібліотеки .NET.
Якщо ви знайомі з Java, це схоже ... Java - це мова, побудована на версії JVM ... хоча будь-яка з попередньо зібраних бібліотек Java може використовуватися іншою мовою, побудованою поверх JVM.
CLR
?
Коли люди говорять про ".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
// =============================================================
У .NET ви не знайдете лише C #. Ви можете знайти, наприклад, Visual Basic. Якщо робота вимагає знань .NET, ймовірно, їй потрібен програміст, який знає весь набір мов, передбачених рамкою .NET.
C#
не має окремої бібліотеки виконання. Він використовується .NET
як бібліотека часу виконання.
Тут я надав вам посилання, де пояснюється, що таке мова C # та архітектура платформи .NET Framework Platform . Пам'ятайте, що C # - це об'єктно-орієнтована мова програмування загального призначення, і вона працює на .NET Framework.
.NET Framework включає велику бібліотеку класів під назвою Framework Class Library (FCL) і забезпечує користувальницький інтерфейс, доступ до даних, підключення до бази даних, криптографію, розробку веб-додатків, числові алгоритми та мережеві комунікації.
.NET Framework була розроблена корпорацією Майкрософт, яка працює в основному на Microsoft Windows.