Введение в C#
На сегодняшний момент язык программирования C# один из самых мощных, быстро развивающихся и востребованных языков в ИТ-отрасли. В настоящий момент на нем пишутся самые различные приложения: от небольших десктопных программок до крупных веб-порталов и веб-сервисов, обслуживающих ежедневно миллионы пользователей.
C# уже не молодой язык и как и вся платформа .NET уже прошел большой путь. Первая версия языка вышла вместе с релизом Microsoft Visual Studio .NET в феврале 2002 года. Текущей версией языка является версия C# 12, которая вышла 14 ноября 2023 года вместе с релизом .NET 8.
C# является языком с Си-подобным синтаксисом и близок в этом отношении к C++ и Java. Поэтому, если вы знакомы с одним из этих языков, то овладеть C# будет легче.
C# является объектно-ориентированным и в этом плане много перенял у Java и С++. Например, C# поддерживает полиморфизм, наследование, перегрузку операторов, статическую типизацию. Объектно-ориентированный подход позволяет решить задачи по построению крупных, но в тоже время гибких, масштабируемых и расширяемых приложений. И C# продолжает активно развиваться, и с каждой новой версией появляется все больше интересных функциональностей.
Роль платформы .NET
Когда говорят C#, нередко имеют в виду технологии платформы .NET (Windows Forms, WPF, ASP.NET, .NET MAUI). И, наоборот, когда говорят .NET, нередко имеют в виду C#. Однако, хотя эти понятия связаны, отождествлять их неверно. Язык C# был создан специально для работы с фреймворком .NET, однако само понятие .NET несколько шире.
Как-то Билл Гейтс сказал, что платформа .NET — это лучшее, что создала компания Microsoft. Возможно, он был прав. Фреймворк .NET представляет мощную платформу для создания приложений. Можно выделить следующие ее основные черты:
- Поддержка нескольких языков . Основой платформы является общеязыковая среда исполнения Common Language Runtime (CLR), благодаря чему .NET поддерживает несколько языков: наряду с C# это также VB.NET, C++, F#, а также различные диалекты других языков, привязанные к .NET, например, Delphi.NET. При компиляции код на любом из этих языков компилируется в сборку на общем языке CIL (Common Intermediate Language) — своего рода ассемблер платформы .NET. Поэтому при определенных условиях мы можем сделать отдельные модули одного приложения на отдельных языках.
- Кроссплатформенность . .NET является переносимой платформой (с некоторыми ограничениями). Например, последняя версия платформы на данный момент — .NET 8 поддерживается на большинстве современных ОС Windows, MacOS, Linux. Используя различные технологии на платформе .NET, можно разрабатывать приложения на языке C# для самых разных платформ — Windows, MacOS, Linux, Android, iOS, Tizen.
- Мощная библиотека классов . .NET представляет единую для всех поддерживаемых языков библиотеку классов. И какое бы приложение мы не собирались писать на C# — текстовый редактор, чат или сложный веб-сайт — так или иначе мы задействуем библиотеку классов .NET.
- Разнообразие технологий . Общеязыковая среда исполнения CLR и базовая библиотека классов являются основой для целого стека технологий, которые разработчики могут задействовать при построении тех или иных приложений. Например, для работы с базами данных в этом стеке технологий предназначена технология ADO.NET и Entity Framework Core. Для построения графических приложений с богатым насыщенным интерфейсом — технология WPF и WinUI, для создания более простых графических приложений — Windows Forms. Для разработки кроссплатформенных мобильных и десктопных приложений — Xamarin/MAUI. Для создания веб-сайтов и веб-приложений — ASP.NET и т.д. К этому стоит добавить активной развивающийся и набирающий популяность Blazor — фреймворк, который работает поверх .NET и который позволяет создавать веб-приложения как на стороне сервера, так и на стороне клиента. А в будущем будет поддерживать создание мобильных приложений и, возможно, десктоп-приложений.
- Производительность . Согласно ряду тестов веб-приложения на .NET в ряде категорий сильно опережают веб-приложения, построенные с помощью других технологий. Приложения на .NET в принципе отличаются высокой производительностью.
Также еще следует отметить такую особенность языка C# и фреймворка .NET, как автоматическая сборка мусора. А это значит, что нам в большинстве случаев не придется, в отличие от С++, заботиться об освобождении памяти. Вышеупомянутая общеязыковая среда CLR сама вызовет сборщик мусора и очистит память.
.NET Framework и .NET 8
Стоит отметить, что .NET долгое время развивался премущественно как платформа для Windows под названием .NET Framework. В 2019 вышла последняя версия этой платформы — .NET Framework 4.8. Она больше не развивается
С 2014 Microsoft стал развивать альтернативную платформу — .NET Core, которая уже предназначалась для разных платформ и должна была вобрать в себя все возможности устаревшего .NET Framework и добавить новую функциональность. Затем Microsoft последовательно выпустил ряд версий этой платформы: .NET Core 1, .NET Core 2, .NET Core 3, .NET 5. И текущей версией является расматриваемая в этом руководстве платформа .NET 8. Поэтому следует различать .NET Framework, который предназначен преимущественно для Windows, и кросплатформенный .NET 8. В данном руководстве речь будет идти о C# 12 в связке с .NET 8, поскольку это актуальная платформа.
Управляемый и неуправляемый код
Нередко приложение, созданное на C#, называют управляемым кодом (managed code). Что это значит? А это значит, что данное приложение создано на основе платформы .NET и поэтому управляется общеязыковой средой CLR, которая загружает приложение и при необходимости очищает память. Но есть также приложения, например, созданные на языке С++, которые компилируются не в общий язык CIL, как C#, VB.NET или F#, а в обычный машинный код. В этом случае .NET не управляет приложением.
В то же время платформа .NET предоставляет возможности для взаимодействия с неуправляемым кодом..
JIT-компиляция
Как выше писалось, код на C# компилируется в приложения или сборки с расширениями exe или dll на языке CIL. Далее при запуске на выполнение подобного приложения происходит JIT-компиляция (Just-In-Time) в машинный код, который затем выполняется. При этом, поскольку наше приложение может быть большим и содержать кучу инструкций, в текущий момент времени будет компилироваться лишь та часть приложения, к которой непосредственно идет обращение. Если мы обратимся к другой части кода, то она будет скомпилирована из CIL в машинный код. При том уже скомпилированная часть приложения сохраняется до завершения работы программы. В итоге это повышает производительность.
По сути это все, что вкратце надо знать о платформе .NET и языке C#. А теперь создадим первое приложение.
В чем разница .NET и C#?
В чем разница .NET и C#?
Это одно и то же или всё-таки разные вещи?
- Вопрос задан более трёх лет назад
- 3415 просмотров
1 комментарий
Оценить 1 комментарий
Saboteur @saboteur_kiev
под .net можно писать не только на C#
Решения вопроса 1

.NET — платформа, в частности включает в себя CLR, CLS и FCL. C# — один из языков, компилируемых в IL код под эту самую CLR. Также существует альтернативная реализация некоторой части .NET (в т.ч. компиляторы некоторых языков и сама среда исполнения) — Mono.
P.S. надо же, запомнил наконец эти аббревиатуры.
Ответ написан более трёх лет назад
Нравится 5 1 комментарий
В чем разница между C# и .NET?
![]()
Меня интересует конкретно связанное с тестированием. Я спрашивал у себя в университете, но дать точного различия мне не смогли ( а я в программировании очень слабо что понимаю и поэтому информацию из статей в интернете которые копи-пастят друг друга трудно понять). Хотелось бы услышать ваше мнение, но прошу вас описывать по-простому. т.к. хочу понять и разобраться.
Даже такой вопрос былу меня к тестировщику: «Какие языки ты сипользуешь для автоматизации»? Ответил что .NET и JAva. После я спросил что C# и .NET это тоже самое? И он ответил что «нет», но рассказать в чем разница так и не смог
#2
Little_CJIOH
Little_CJIOH
![]()
Отправлено 22 июня 2018 — 13:27
C# — Язык программирования.
.Net — программная платформа. Среда, в которой исполняется программа.
Относятся друг к другу так-же как Java к JVM
#3
Freiman
Отправлено 22 июня 2018 — 13:34
Относятся друг к другу так-же как Java к JVM
Объяснил! 🙂 Следующий вопрос — «в чем разница между Java и JVM»
#4
KnopkaZapuska
KnopkaZapuska
Отправлено 22 июня 2018 — 13:36
C# — Язык программирования.
.Net — программная платформа. Среда, в которой исполняется программа.
Относятся друг к другу так-же как Java к JVM
Хорошо, тогда чем отличется .Net от Visual Studio? И там и там платформа
Или вы хотели сказать что C# это язык который работает на платформе .Net и его можно писать в программе Visual Studio и других?
#5
Little_CJIOH
Little_CJIOH
![]()
Отправлено 22 июня 2018 — 13:38
Ну, я несколько больше написал.
Кстати, что это за университет? Страна должна знать своих героев.
#6
Little_CJIOH
Little_CJIOH
![]()
Отправлено 22 июня 2018 — 13:46
C# — Язык программирования.
.Net — программная платформа. Среда, в которой исполняется программа.
Относятся друг к другу так-же как Java к JVM
Хорошо, тогда чем отличется .Net от Visual Studio? И там и там платформа
Или вы хотели сказать что C# это язык который работает на платформе .Net и его можно писать в программе Visual Studio и других?
Visual Studio — Это среда разработки.
Вы в среде разработки пишете программу, которая будет исполняться в некоей среде исполнения.
Visual Studio — C# — .Net
Intelij Idea — Java — JVM
PyCharm — Python — интерпретатор Python
#7
Spock
Отправлено 22 июня 2018 — 13:52
можно и не только на сишарпе писать программы, чтобы на дотнете их выполнять
Visual Basic -> .NET
#8
KnopkaZapuska
KnopkaZapuska
Отправлено 22 июня 2018 — 13:53
C# — Язык программирования.
.Net — программная платформа. Среда, в которой исполняется программа.
Относятся друг к другу так-же как Java к JVM
Хорошо, тогда чем отличется .Net от Visual Studio? И там и там платформа
Или вы хотели сказать что C# это язык который работает на платформе .Net и его можно писать в программе Visual Studio и других?
Visual Studio — Это среда разработки.
Вы в среде разработки пишете программу, которая будет исполняться в некоей среде исполнения.
Visual Studio — C# — .Net
Intelij Idea — Java — JVM
PyCharm — Python — интерпретатор Python
Надеюсь что последний вопрос. Так зачем в итоге нам нужны .Net, JVM? Если простым язык. Можно их назвать «плагины’ или «расширения» или как я знаю в программировании это называется «библиотеки»?
#9
Little_CJIOH
Little_CJIOH
![]()
Отправлено 22 июня 2018 — 14:49
C# — Язык программирования.
.Net — программная платформа. Среда, в которой исполняется программа.
Относятся друг к другу так-же как Java к JVM
Хорошо, тогда чем отличется .Net от Visual Studio? И там и там платформа
Или вы хотели сказать что C# это язык который работает на платформе .Net и его можно писать в программе Visual Studio и других?
Visual Studio — Это среда разработки.
Вы в среде разработки пишете программу, которая будет исполняться в некоей среде исполнения.
Visual Studio — C# — .Net
Intelij Idea — Java — JVM
PyCharm — Python — интерпретатор Python
Надеюсь что последний вопрос. Так зачем в итоге нам нужны .Net, JVM? Если простым язык. Можно их назвать «плагины’ или «расширения» или как я знаю в программировании это называется «библиотеки»?
как выше уже было сказано, это среда исполнения. И нужна она для исполнения программы. Без среды исполнения программа — бесполезный набор символов/байтиков.
Есть еще хорошее слово интерпретатор.
.Net интерпретирует CIL (MSIL), в который компилируется C#, VB, C++ и еще некоторые языки
JVM интерпретирует Java байт-код, в который компилируются Java, Scala и другие подобные языки.
Параллелизм, многопоточность, асинхронность: разница и примеры применения (.NET, C#)
Давайте разберёмся, сколько программных моделей используют C#-разработчики и в чём их отличия. Особенности каждой модели рассмотрим подробно.
Тимур Гайфулин
Руководитель группы разработки digital-интегратора DD Planet
Многие начинающие специалисты путают многопоточное, асинхронное и параллельное программирование. На первый взгляд, может показаться, что это одно и то же — но нет. Давайте разберёмся, сколько программных моделей используют C#-разработчики и в чём их отличия. Материал подготовлен совместно с Алексеем Гришиным, ведущим разработчиком DD Planet.
Существует несколько концепций: синхронное/асинхронное программирование и однопоточные/многопоточные приложения. Причём первая программная модель может работать в однопоточной или многопоточной среде. То есть приложение может быть: синхронным однопоточным, синхронным многопоточным и асинхронным многопоточным.
Отдельной концепцией считается параллелизм, который является подмножеством многопоточного типа приложений. Рассмотрим особенности каждой программной модели подробнее.
Синхронная модель
Потоку назначается одна задача, и начинается её выполнение. Заняться следующей задачей можно только тогда, когда завершится выполнение первой. Эта модель не предполагает приостановку одной задачи, чтобы выполнить другую.
Однопоточность
Система в одном потоке работает со всеми задачами, выполняя их поочерёдно.
Однопоточная синхронная система[/caption]
Многопоточность
В этом случае речь о нескольких потоках, в которых выполнение задач идет одновременно и независимо друг от друга.
Многопоточная синхронная система[/caption]
Пример такого концепта — одновременная разработка веб- и мобильного приложений и серверной части, при условии соблюдения архитектурных «контрактов».
Использование нескольких потоков выполнения — один из способов обеспечить возможность реагирования приложения на действия пользователя при одновременном использовании процессора для выполнения задач между появлением или даже во время появления событий пользователя.
Асинхронность
Характеристики асинхронного кода:
- обрабатывает больше запросов сервера, предоставляя потокам возможность обрабатывать больше запросов во время ожидания результата от запросов ввода-вывода;
- делает пользовательский интерфейс быстрым, выделяя потоки для обработки действий в пользовательском интерфейсе во время ожидания запросов ввода-вывода, передавая затратные по времени операции другим ядрам ЦП.
Если у системы много потоков, то их асинхронная работа выглядит примерно так:
Многопоточная асинхронная система[/caption]
Конструкция async/await
Для работы с асинхронными вызовами в C# необходимы два ключевых слова:
- async — используется в заголовке метода;
- await — вызывающий метод содержит одно или несколько таких выражений.
Они используются вместе для создания асинхронного метода. У асинхронных методов могут быть следующие типы возвращаемых значений:
- Task для асинхронного метода, который выполняет операцию, но не возвращает значение;
- Task для асинхронного метода, возвращающего значение;
- void для обработчика событий;
- начиная с версии 7.0 в языке C# поддерживаются любые типы с доступным методом GetAwaiter;
- начиная с версии 8.0 в языке C# поддерживается интерфейс IAsyncEnumerable для асинхронного метода, который возвращает асинхронный поток.
Сама конструкция async/await появилась в C# 5.0 с выходом .NET Framework 4.5 и отчасти представляет собой синтаксический сахар. Механизм async/await не имеет реализации в CLR и разворачивается компилятором в сложную конструкцию на IL. Но эта конструкция — не сахар вокруг тасок, а отдельный механизм, использующий класс Task для переноса состояния исполняемой части кода.
Пример асинхронного метода:
using System; using System.Threading; using System.Threading.Tasks; namespace FactorialApp < class Program < static void Factorial() < int result = 1; for (int i = 1; i Thread.Sleep(8000); Console.WriteLine($"Факториал равен "); > // определение асинхронного метода static async void FactorialAsync() < Console.WriteLine("Начало метода FactorialAsync"); // выполняется синхронно await Task.Run(() =>Factorial()); // выполняется асинхронно Console.WriteLine("Конец метода FactorialAsync"); > static void Main(string[] args) < FactorialAsync(); // вызов асинхронного метода Console.WriteLine("Введите число: "); int n = Int32.Parse(Console.ReadLine()); Console.WriteLine($"Квадрат числа равен "); Console.Read(); > > >
Результат асинхронного вычисления факториала[/caption]
Этот пример приведён лишь для наглядности, особого смысла делать логику вычисления факториала асинхронной нет. Опять же, для имитации долгой работы мы использовали задержку на 8 секунд с помощью методы Thread.Sleep(). Цель была показать: асинхронная задача, которая может выполняться долгое время, не блокирует основной поток — в этом случае метод Main(), и мы можем вводить и обрабатывать данные, продолжая работу с ним.
Параллелизм
Эта программная модель подразумевает, что задача разбивается на несколько независимых подзадач, которые можно выполнить параллельно, а затем объединить результаты. Примером такой задачи может быть Parallel LINQ:
IEnumerable yourData = GetYourData(); var result = yourData.AsParallel() // начинаем обрабатывать параллельно .Select(d => d.CalcAmount()) // Вычисляем параллельно .Where(amount => amount > 0) .ToArray(); // Возвращаемся к синхронной модели
Обзор архитектуры параллельного программирования в .NET[/caption]
Еще один пример — вычисление среднего значения двумерного массива, когда каждый отдельный поток может подсчитать сумму своей строки, а потом объединить результат и вычислить среднее.
Однако не стоит забывать, что не все задачи поддаются распараллеливанию. Например, описанная выше задача по вычислению факториала, в которой на каждом последующем этапе нужен результат предыдущего.
Какую программную модель выбрать?
Перечисленные программные модели должны применяться в зависимости от задач. Их можно использовать как отдельно во всём приложении, так и сочетать между собой. Главное, чтобы приложение было максимально эффективным и удовлетворяло требования пользователя.
Если речь идет о сложных многопользовательских приложениях, то стремиться стоит к использованию асинхронной модели, так как важна интерактивность и отзывчивость интерфейса. Взаимодействие с пользователем в активном режиме всегда должно быть максимально эффективным, даже если в фоновом режиме в то же время выполняются другие задачи. Издержки асинхронности, например, на переключение исполняемого контекста, в таком случае нивелируются за счет общей эффективности приложения.
В разработке простых приложений, к примеру, парсера документа, необходимости в асинхронности, или даже многопоточности, может и не быть.