В чем разница между C # и .NET?


204

Могу ли я узнать, в чем разница между C # и .NET? Когда я думаю о C #, я сразу говорю, что это язык .NET, но когда я ищу вакансии, им требуется, чтобы кандидаты имели опыт работы с C # и .NET. Может кто-нибудь дать мне объяснение?


41
Я могу объяснить требования к сообщениям ... Они написаны не разработчиками .NET. Либо сотрудники отдела кадров, либо менеджеры, которым НЕ НУЖНО понимать разницу.
Дэвид

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

Ответы:


128

Помимо того, что сказал Андрей, стоит отметить, что:

  • .NET - это не только библиотека , но и среда выполнения приложений.
  • Знание C # подразумевает некоторое знание .NET (потому что объектная модель C # соответствует объектной модели .NET, и вы можете сделать что-то интересное в C #, просто используя библиотеки .NET). Обратное не обязательно верно, так как вы можете использовать другие языки для написания приложений .NET.

Различие между языком , средой выполнения и библиотекой является более строгим в .NET / C #, чем, например, в C ++, где спецификация языка также включает некоторые базовые библиотечные функции. Спецификация C # очень мало говорит об окружающей среде (в основном, она должна содержать некоторые типы, такие как int, но это более или менее все).


197

C # - это язык программирования, .NET - это общий термин, охватывающий как .NET Framework (библиотека фреймворка приложения), так и Common Language Runtime, который является средой выполнения, в которой запускаются сборки .NET.

Реализация Microsoft 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 Framework (неявно, да, но тем не менее использует), потому что Exampleнаследуется от System.Object.

Кроме того, причина, по которой я использую фразу C # для реализации C #, заключается в том, что существуют другие реализации 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
Франк Q.


50

C # является сильным объектно-ориентированным языком программирования, который в основном построен на платформе .NET.

C # - это самолет, а .NET - взлетно-посадочная полоса;)


16

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

Если вы знакомы с Java, это похоже на ... Java - это язык, построенный поверх JVM ... хотя любая из предварительно собранных библиотек Java может использоваться другим языком, созданным поверх JVM.


что подразумевается под CLR?
Касун Сиямбалапития

2
Общий язык Runtime
Яхья-Имам Мунир

1
@KasunSiyambalapitiya CLR используется для преобразования в код в нативный код. Я имею в виду, что вы пишете код c #, преобразование будет таким: C # => CLR => Native code. Тогда он будет работать на всех платформах, таких как 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», который свободно доступен в Microsoft SDK (и может быть уже на вашем компьютере), вы можете увидеть, как код C # преобразуется в метаданные и IL. Я включил образец внизу этого ответа в качестве примера.

Когда вы запускаете исполняемый код .net, обычно происходит то, что виртуальная машина .net читает этот IL и обрабатывает его. Это другая сторона .net, и, опять же, вы, вероятно, можете себе представить, что это можно легко написать на неуправляемом языке - ему «нужно только» прочитать инструкции VM и запустить их (и интегрировать с сборщиком мусора, который также требует не быть .net кодом).

Я описал (опять же, примерно), что происходит, когда вы создаете исполняемый файл в Visual Studio (для получения дополнительной информации я настоятельно рекомендую книгу «CLR via 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 Framework.


1
Вы абсолютно правы, и спасибо за заголовок. Хотя я упоминаю только C # в этом вопросе, но в этой конкретной должности он также упоминает VB ..
Bopha

5

C # это язык программирования.

.Net - это фреймворк, используемый для создания приложений в Windows.

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


4

C#не имеет отдельной библиотеки времени выполнения. Он использует .NETв качестве библиотеки времени выполнения.


Вы имеете в виду реализацию Microsoft C #.
Нишант Джордж Агвал

Да. Я понятия не имею о других реализациях.
Иуда

Как упоминал Эндрю Хэйр в своем ответе, Mono c #
Vort3x

3

Здесь я предоставил вам ссылку, где объясняется, что такое язык C # и архитектура платформы .NET Framework . Помните, что C # - это объектно-ориентированный язык программирования общего назначения, и он работает на .NET Framework.

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

.NET Framework была разработана Microsoft и работает в основном под управлением Microsoft Windows.

Введение в язык C # и .NET Framework от Microsoft Docs

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.