С#
Изображение логотипа
Класс языка
Появился в 2001
Автор Андерс Хейлсберг
Разработчик .NET Foundation
Расширение файлов .cs или .csx
Выпуск 12 (14 ноября 2023 года)
Система типов статическая, динамическая, строгая, безопасная, вывод типов
Основные реализации .NET Framework, Mono, .NET, DotGNU (заморожен), Universal Windows Platform
Диалекты , Spec#, Polyphonic C#[англ.], Enhanced C#
Испытал влияние C++, Java[1][2][3], Delphi, Модула-3 и Smalltalk
Повлиял на , F#, Nemerle, Vala, Windows PowerShell, Kotlin
Лицензия

Компилятор Roslyn: лицензия MIT[4]
.NET Core CLR: лицензия MIT[5]

Компилятор Mono: dual GPLv3 and MIT/X11

DotGNU: dual GPL and LGPL
Сайт docs.microsoft.com/ru-ru…
Платформа Common Language Infrastructure
Логотип Викисклада Медиафайлы на Викискладе

C# (произносится си шарп) — объектно-ориентированный язык программирования общего назначения. Разработан в 19982001 годах группой инженеров компании Microsoft под руководством Андерса Хейлсберга и Скотта Вильтаумота[6] как язык разработки приложений для платформы Microsoft .NET Framework и .NET Core. Впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.

C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, переменные, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.

Переняв многое от своих предшественников — языков C++, Delphi, Модула, Smalltalk и, в особенности, Java — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# в отличие от C++ не поддерживает множественное наследование классов (между тем допускается множественная реализация интерфейсов).

Особенности языка

[править | править код]

С#‎ разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов С#‎, которая отражает BCL. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем (однако, эта закономерность была нарушена с выходом C# 3.0, представляющего собой расширения языка, не опирающиеся на расширения платформы .NET). CLR предоставляет С#‎, как и всем другим .NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора не реализована в самом C#‎, а производится CLR для программ, написанных на C#, точно так же, как это делается для программ на VB.NET, J# и др.

Название языка

[править | править код]
Нота C♯[англ.]

Название «Си шарп» (от англ. sharp — диез) происходит от буквенной музыкальной нотации, где латинской букве C соответствует нота До, а знак диез (англ. sharp) означает повышение соответствующего ноте звука на полутон[7], что аналогично названию языка C++, где «++» обозначает инкремент переменной. Название также является игрой с цепочкой CC++ → C++++(C#), так как символ «#» можно представить состоящим из 4 знаков «+»[8].

Из-за технических ограничений на отображение (стандартные шрифты, браузеры и т. д.), а также из-за того, что знак диеза ♯ не представлен на стандартной клавиатуре компьютера, при записи имени языка программирования используют знак решётки (#)[9]. Это соглашение отражено в Спецификации языка C# ECMA-334[10]. Тем не менее, на практике (например, при размещении рекламы и коробочном дизайне[11]), «Майкрософт» использует знак диеза.

Названия языков программирования не принято переводить, поэтому язык называют, используя транскрипцию, — «Си шарп».

Стандартизация

[править | править код]

C# стандартизирован в ECMA (ECMA-334)[12] и ISO (ISO/IEC 23270)[13].

Известно как минимум о трёх независимых реализациях C#, базирующихся на этой спецификации и находящихся в настоящее время на различных стадиях разработки:

Версии

[править | править код]

На протяжении разработки языка C# было выпущено несколько его версий:

Версия Спецификация языка Дата выхода Совместимые версии .NET Совместимая версия Visual Studio
ECMA ISO/IEC Microsoft
C# 1.0 Декабрь 2002 Апрель 2003 (недоступная ссылка) Январь 2002 Январь 2002 .NET Framework 1.0 Visual Studio .NET (2002)
C# 1.1
C# 1.2
Октябрь 2003 Апрель 2003 .NET Framework 1.1 Visual Studio .NET 2003
C# 2.0 Июнь 2006 Сентябрь 2006 Сентябрь 2005[14] Ноябрь 2005 .NET Framework 2.0
.NET Framework 3.0
Visual Studio 2005
C# 3.0 Отсутствует[15] Август 2007 Ноябрь 2007 .NET Framework 2.0 (кроме LINQ)
.NET Framework 3.0 (кроме LINQ)
.NET Framework 3.5
Visual Studio 2008
C# 4.0 Апрель 2010 Апрель 2010 .NET Framework 4.0 Visual Studio 2010
C# 5.0 Декабрь 2017 Декабрь 2018 Июнь 2013 Август 2012 .NET Framework 4.5 Visual Studio 2012
C# 6.0 Июнь 2022 Отсутствует Июль 2015 .NET Framework 4.6
.NET Core 1.0
.NET Core 1.1
Visual Studio 2015
C# 7.0 Декабрь 2023 Сентябрь 2023 Март 2017 .NET Framework 4.6.2
.NET Framework 4.7
Visual Studio 2017 15.0
C# 7.1 Отсутствует Август 2017 .NET Core 2.0 Visual Studio 2017 15.3
C# 7.2 Ноябрь 2017 Visual Studio 2017 15.5
C# 7.3 Май 2018 .NET Core 2.1
.NET Core 2.2
.NET Framework 4.8
Visual Studio 2017 15.7
C# 8.0 Сентябрь 2019 .NET Core 3.0
.NET Core 3.1
.NET Framework 4.8
Visual Studio 2019 16.3
C# 9.0 Сентябрь 2020 .NET 5.0 Visual Studio 2019 16.8
C# 10.0 Июль 2021 .NET 6.0 Visual Studio 2022 17.0
C# 11.0 Ноябрь 2022 .NET 7.0 Visual Studio 2022 17.4
C# 12.0 Ноябрь 2023 .NET 8.0 Visual Studio 2022 17.8[16]
Общая информация по версиям
Версия Нововведения
C# 2.0
  • Частичные типы
  • Обобщённые типы (generics)
  • Итераторы и ключевое слово yield
  • Анонимные методы
  • Оператор null-объединения
  • Nullable-типы
C# 3.0
  • Запросы, интегрированные в язык (LINQ)
  • Инициализаторы объектов и коллекций
  • Лямбда-выражения
  • Деревья выражений
  • Неявная типизация и ключевое слово var
  • Анонимные типы
  • Методы расширения
  • Автоматические свойства
C# 4.0
  • Динамическое связывание и ключевое слово dynamic
  • Именованные и опциональные аргументы
  • Обобщенная ковариантность и контрвариантность
  • Библиотека TPL, концепция задач и классы Task, Parallel
  • Класс MemoryCache
  • Классы параллельных коллекций
C# 5.0
  • Шаблон TAP
  • Асинхронные методы async и await
  • Сведения о вызывающем объекте
C# 6.0
  • Компилятор как сервис
  • Импорт членов статических типов в пространство имён
  • Фильтры исключений
  • await в блоках catch/finally
  • Инициализаторы автосвойств
  • Автосвойства только для чтения
  • null-условные операции (?. и ?[])
  • Интерполяция строк
  • Оператор nameof
  • Инициализатор словаря
  • Функции сжатые до выражений
C# 7.0[17]
  • out-переменные
  • Сопоставление с шаблоном
  • Шаблоны с is
  • Шаблоны и выражение switch
  • Кортежи
  • Распаковка кортежей (деконструкторы)
  • Локальные функции
  • Улучшения литералов
  • Локальные переменные и возвращаемые значения по ссылке
  • Расширение списка типов, возвращаемых асинхронными методами
  • Больше членов класса в виде выражений
  • throw выражения
C# 8.0
  • Члены только для чтения
  • Члены интерфейса по умолчанию
  • Улучшения сопоставления шаблонов
  • Объявления using
  • Статические локальные функции
  • Удаляемые ссылочные структуры
  • Ссылочные типы, допускающие значение NULL
  • Асинхронные потоки
  • Индексы и диапазоны
  • Присваивание объединения со значением NULL
  • Неуправляемые сконструированные типы
  • Выражения stackalloc во вложенных выражениях
  • Больше членов класса в виде выражений
  • Улучшения интерполированных строк
C# 9.0
  • Оператор объединения с null (??)
  • Пустые параметры для лямбда-выражений
  • Native Int: nint, nuint
  • Дизъюнктное объединение
  • Добавлено with-выражения
  • новый модификатор initonly
C# 10.0
  • Добавление role="alert" атрибуты сообщений
  • ОбновленияCounter компонент для добавления role="status"
  • Замена ul в NavBar компонент для nav
  • Новое название кнопки переключенияNavBar
  • Переход к использованию более семантической разметки
C# 11.0
  • Необработанные строковые литералы
  • Поддержка универсальной математики
  • Универсальные атрибуты
  • Строковые литералы UTF-8
  • Новые строки в выражениях интерполяции строк
  • Шаблоны списка
  • Локальные типы файлов
  • Обязательные элементы
  • Автоматические структуры по умолчанию
  • Сопоставление Span<char> шаблонов для константы string
  • Расширенные nameof область
  • Числовой intPtr
  • ref поля и scoped ref
  • Улучшенное преобразование групп методов для делегирования.

Версия 1.0

[править | править код]

Проект C# был начат в декабре 1998 и получил кодовое название COOL (C-style Object Oriented Language). Версия 1.0 была анонсирована вместе с платформой .NET в июне 2000 года, тогда же появилась и первая общедоступная бета-версия; C# 1.0 окончательно вышел вместе с Microsoft Visual Studio .NET в феврале 2002 года.

Первая версия C# напоминала по своим возможностям Java 1.4, несколько их расширяя: так, в C# имелись свойства (выглядящие в коде как поля объекта, но на деле вызывающие при обращении к ним методы класса), индексаторы (подобные свойствам, но принимающие параметр как индекс массива), события, делегаты, циклы foreach, структуры, передаваемые по значению, автоматическое преобразование встроенных типов в объекты при необходимости (boxing), атрибуты, встроенные средства взаимодействия с неуправляемым кодом (DLL, COM) и прочее.

Кроме того, в C# решено было перенести некоторые возможности C++, отсутствовавшие в Java: беззнаковые типы, перегрузку операторов (с некоторыми ограничениями, в отличие от C++), передача параметров в метод по ссылке, методы с переменным числом параметров, оператор goto (с ограничениями). Также в C# оставили ограниченную возможность работы с указателями — в местах кода, специально обозначенных словом unsafe и при указании специальной опции компилятору.

Версия 2.0

[править | править код]

Проект спецификации C# 2.0 впервые был опубликован Microsoft в октябре 2003 года; в 2004 году выходили бета-версии (проект с кодовым названием Whidbey), C# 2.0 окончательно вышел 7 ноября 2005 года вместе с Visual Studio 2005 и .NET 2.0.

Новые возможности в версии 2.0

Версия 3.0

[править | править код]

В июне 2004 года Андерс Хейлсберг впервые рассказал на сайте Microsoft о планируемых расширениях языка в C#3.0[19]. В сентябре 2005 года вышли проект спецификации C# 3.0 и бета-версия C# 3.0, устанавливаемая в виде дополнения к существующим Visual Studio 2005 и .NET 2.0. Окончательно эта версия языка вошла в Visual Studio 2008 и .NET 3.5.

Новые возможности в версии 3.0

В C# 3.0 появились следующие радикальные добавления к языку:

Customer c = new Customer(); c.Name = "James"; c.Age=30;
можно записать как
Customer c = new Customer { Name = "James", Age = 30 };
listOfFoo.Where(delegate(Foo x) { return x.size > 10; });
теперь можно записать как
listOfFoo.Where(x => x.size > 10);
лямбда-выражения теперь могут представляться в виде структуры данных, доступной для обхода во время выполнения, тем самым позволяя транслировать строго типизированные C#-выражения в другие домены (например, выражения SQL).
public static class StringExtensions
{
  public static int ToInt32(this string val)
  {
    return Int32.Parse(val);
  }
}
// ...
string s = "10";
int x = s.ToInt32();
public string Name { get; private set; }

C# 3.0 совместим с C# 2.0 по генерируемому MSIL-коду; улучшения в языке — чисто синтаксические и реализуются на этапе компиляции. Например, многие из интегрированных запросов LINQ можно осуществить, используя безымянные делегаты в сочетании с предикатными методами над контейнерами наподобие List.FindAll и List.RemoveAll.

Версия 4.0

[править | править код]

Превью C# 4.0 было представлено в конце 2008 года, вместе с CTP-версией Visual Studio 2010.

Visual Basic 10.0 и C# 4.0 были выпущены в апреле 2010 года, одновременно с выпуском Visual Studio 2010.

Новые возможности в версии 4.0[20]

Примеры:

dynamic calc = GetCalculator();
int sum = calc.Add(10, 20); // Динамический вызов
public void SomeMethod(int x, int y = 5, int z = 7); // Опциональные параметры

Версия 5.0

[править | править код]

Новые возможности в версии 5.0

Версия 6.0

[править | править код]

Новые возможности в версии 6.0

int? length = customers?.Length; // null if customers is null
Customer first = customers?[0];  // null if customers is null
public Point Move(int dx, int dy) => new Point(x + dx, y + dy);
public string First { get; set; } = "Jane";
public string First { get; } = "Jane";
var numbers = new Dictionary<int, string> {
    [7] = "seven",
    [9] = "nine",
    [13] = "thirteen"
};
var s = String.Format("{0} is {1} year((s)) old", p.Name, p.Age);

теперь можно размещать код прямо в строке:

var s = $"{p.Name} is {p.Age} year((s)) old";
try {  } catch (Exception e) when (Log(e)) {  }
using static System.Console;
using static System.Math;
class Program
{
    static void Main()
    {
        WriteLine(Sqrt(3*3 + 4*4)); 
    }
}
WriteLine(nameof(person.Address.ZipCode)); // prints "ZipCode"
Resource res = null;
try
{
    res = await Resource.OpenAsync();       // You could do this.
} 
catch(ResourceException e)
{
    await Resource.LogAsync(res, e);         // Now you can do this …
}
finally
{
    if (res != null) await res.CloseAsync(); // … and this.
}

Версия 7.0

[править | править код]

Новые возможности в версии 7.0[17]

p.GetCoordinates(out int x, out int y);
(string, string, string) LookupName(long id) // возвращаемый тип - кортеж
{
    ... // инициализируем данные
    return (first, middle, last); // литерал кортежа
}
public string GetLastName() => throw new NotImplementedException();

Версия 8.0

[править | править код]

Новые возможности в версии 8.0[21]

Версия 9.0

[править | править код]

Новые возможности в версии 9.0[22]

Версия 10.0

[править | править код]

Новые возможности в версии 10.0[23]

Версия 11.0

[править | править код]

Новые возможности в версии 11.0[24]

Версия 12.0

[править | править код]

Новые возможности в версии 12.0[25]

Пример «Hello, World!»

[править | править код]

Ниже представлен код классической программы «Hello world» на C# для консольного приложения:

Console.WriteLine("Hello World!");

и код этой же программы для приложения Windows Forms:

namespace WindowsForms;

public class Program
{
    [STAThread]
    public static void Main() => new DemoForm().ShowDialog();
}

public class DemoForm : Form
{
    Label label = new Label();

    public DemoForm()
    {
        label.Text = "Hello World!";
        this.Controls.Add(label);
        this.StartPosition = FormStartPosition.CenterScreen;
        this.BackColor = Color.White;
        this.FormBorderStyle = FormBorderStyle.Fixed3D;
    }
}

Реализации

[править | править код]

Существует несколько реализаций C#:

Примечания

[править | править код]
  1. «Поскольку язык С# унаследовал свой синтаксис от C++ и Java…» Трей Нэш. C# 2010: ускоренный курс для профессионалов = Accelerated C# 2010. — М.: Вильямс, 2010. — С. 17. — 592 с. — ISBN 978-5-8459-1638-9.
  2. «Язык C# <…> унаследовал много полезных возможностей от других языков программирования и напрямую связан с двумя наиболее широко применяемыми в мире компьютерными языками — C и C++, а также с языком Java», однако далее: «Связь между C# и Java более сложная. Оба языка разработаны для создания переносимого кода, базируются на C и C++, используют их синтаксис и объектную модель. Однако между этими языками нет прямой связи, они больше похожи на двоюродных братьев, имеющих общих предков, но отличающихся многими признаками» Герберт Шилдт. C# учебный курс = C#. A Beginner's Guide. — М.: Питер, 2003. — С. 20. — ISBN 966-552-121-7.
  3. Герберт Шилдт. Полный справочник по С# = C#: The Complete Reference. — М.: Издательский дом «Вильямс», 2004. — С. 26—27. — 752 с. — ISBN 5-8459-0563-X.
  4. Лицензия (Roslyn) в репозитории Github. Дата обращения: 4 января 2022. Архивировано 4 января 2022 года.
  5. Лицензия (.NET CLR) в репозитории Github. Дата обращения: 4 января 2022. Архивировано 4 января 2022 года.
  6. Либерти Д. Язык программирования C# // Программирование на C#. — Санкт-Петербург. — 2003: Символ-Плюс, 2003. — С. 26. — 688 с. — ISBN 5-93286-038-3.
  7. Kovacs, James C#/.NET History Lesson (англ.) (7 сентября 2007). Дата обращения: 23 марта 2011. Архивировано 21 августа 2011 года.
  8. The A-Z of Programming Languages: C# (англ.). computerworld.com.au (1 октября 2008). Дата обращения: 2 сентября 2014. Архивировано из оригинала 2 апреля 2015 года.
  9. Microsoft C# FAQ. Microsoft. Дата обращения: 25 марта 2008. Архивировано 30 апреля 2003 года.
  10. C# Language Specification (неопр.). — 4th. — Ecma International, 2006. Архивировано 2 декабря 2012 года. Архивированная копия. Дата обращения: 26 января 2011. Архивировано 2 декабря 2012 года.
  11. Visual C#.net Standard (JPEG). Microsoft (4 сентября 2003). Дата обращения: 18 июня 2009. Архивировано 21 августа 2011 года.
  12. Standard ECMA-334 C# Language Specification, 4rd edition (англ.). Ecma International (июнь 2006). Дата обращения: 16 мая 2017. Архивировано 31 октября 2010 года.
  13. ISO/IEC 23270:2003 Information technology -- C# Language Specification (англ.). International Organization for Standardization (апрель 2003). Дата обращения: 16 мая 2017. Архивировано 5 августа 2017 года.
  14. Спецификация по Microsoft C# 2.0 содержит описание лишь новых возможностей версии 2.0. Особенности версии описаны в спецификации 1.2, приведенной выше.
  15. Для версий языка C# 3.0, 4.0 и 5.0 пока нет утверждённых ECMA или ISO/IEC спецификаций.
  16. Заметки релиза Visual Studio 2022 17.8. Microsoft Learn. Дата обращения: 29 июня 2023. Архивировано 6 августа 2023 года.
  17. 1 2 Mads Torgersen. New Features in C# 7.0 (англ.). .NET Blog. Microsoft (9 марта 2017). Дата обращения: 7 мая 2017. Архивировано 11 апреля 2017 года.
  18. Differences Between C++ Templates and C# Generics (C# Programming Guide) (англ.). Microsoft (17 декабря 2016). Дата обращения: 16 мая 2017. Архивировано 7 августа 2021 года.
  19. Anders Hejlsberg - Programming data in C# 3.0 (англ.). The Channel 9 Team. Microsoft (16 июня 2004). Дата обращения: 16 мая 2017. Архивировано 12 ноября 2018 года.
  20. Visual Studio 2010: примеры для C# 4.0. Microsoft (17 июля 2012). Дата обращения: 16 мая 2017. Архивировано 28 февраля 2017 года.
  21. Новые возможности C# 8.0. docs.microsoft.com. Дата обращения: 11 июня 2020. Архивировано 8 августа 2020 года.
  22. Новые возможности C# 9.0. docs.microsoft.com. Дата обращения: 29 апреля 2023. Архивировано 8 декабря 2022 года.
  23. Новые возможности C# 10.0. docs.microsoft.com. Дата обращения: 11 апреля 2023. Архивировано 24 октября 2023 года.
  24. Новые возможности C# 11.0. docs.microsoft.com. Дата обращения: 1 июня 2024. Архивировано 26 сентября 2023 года.
  25. Новые возможности C# 12.0. docs.microsoft.com. Дата обращения: 3 марта 2024. Архивировано 21 декабря 2023 года.
  26. Dot Net Anywhere. Дата обращения: 5 марта 2009. Архивировано 4 мая 2009 года.

Литература

[править | править код]

Ссылки

[править | править код]