C Sharp

Материал из Википедии — свободной энциклопедии
Перейти к навигацииПерейти к поиску
Не следует путать сC++.
Термин «C» имеет такжедругие значения.
Правильный заголовок этой статьи —C#. Он заменён на другой из-затехнических ограничений.
С#
Изображение логотипа
Класс языка
Появился в2001
АвторАндерс Хейлсберг
Разработчик.NET Foundation
Расширение файлов.cs или.csx
Выпуск14 (11 ноября2025 года)
Система типовстатическая,динамическая,строгая,безопасная,вывод типов
Основные реализации.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: dualGPLv3 and MIT/X11

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

C# (произноситсяси шарп) —объектно-ориентированныйязык программирования общего назначения. Разработан в19982001 годах группой инженеров компанииMicrosoft под руководствомАндерса Хейлсберга иСкотта Вильтаумота[6] как язык разработки приложений для платформыMicrosoft .NET Framework и.NET. Впоследствии был стандартизирован как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
ECMAISO/IECMicrosoft
C# 1.0Декабрь 2002Апрель 2003 (недоступная ссылка)Январь 2002Январь 2002.NET Framework 1.0Visual Studio .NET (2002)
C# 1.1
C# 1.2
Октябрь 2003Апрель 2003.NET Framework 1.1Visual 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.0Visual Studio 2010
C# 5.0Декабрь 2017Декабрь 2018Июнь 2013Август 2012.NET Framework 4.5Visual 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.0Visual Studio 2017 15.3
C# 7.2Ноябрь 2017Visual 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.0Visual Studio 2019 16.8
C# 10.0Июль 2021.NET 6.0Visual Studio 2022 17.0
C# 11.0Ноябрь 2022.NET 7.0Visual Studio 2022 17.4
C# 12.0Ноябрь 2023.NET 8.0Visual 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
  • Частичные типы (разделение реализации класса более чем на одинфайл).
  • Обобщённые, или параметризованные типы (generics). В отличие отшаблонов C++, они поддерживают некоторые дополнительные возможности и работают на уровневиртуальной машины. Вместе с тем, параметрами обобщённого типа не могут быть выражения, они не могут быть полностью или частично специализированы, не поддерживают шаблонных параметров по умолчанию, от шаблонного параметра нельзя наследоваться, и т. д.[18]
  • Новая формаитератора, позволяющая создаватьсопрограммы с помощью ключевого словаyield, подобноPython иRuby.
  • Анонимные методы, обеспечивающие функциональностьзамыкания.
  • Операторnull-объединения: '??':return obj1 ?? obj2; означает (в нотации C# 1.0)return obj1!=null ? obj1 : obj2;.
  • Обнуляемые (nullable) типы — значения (обозначаемые вопросительным знаком, например,int? i = null;), представляющие собой те же самые типы-значения, способные принимать также значениеnull. Такие типы позволяют улучшить взаимодействие сбазами данных через языкSQL.
  • Возможность создаватьхранимые процедуры, триггеры и даже типы данных на .Net языках (в том числе и на C#).
  • Поддержка 64-разрядных вычислений, что кроме всего прочего, позволяет увеличить адресное пространство и использовать 64-разрядныепримитивные типы данных.

Версия 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 появились следующие радикальные добавления к языку:

  • ключевые словаselect, from, where, позволяющие делать запросы изXML документов, коллекцийи т. п. Эти запросы имеют сходство с запросамиSQL и реализуются компонентомLINQ. (Сама фраза «language integrated query» переводится «запрос, интегрированный в язык».)
  • Инициализация объекта вместе с его свойствами:
Customerc=newCustomer();c.Name="James";c.Age=30;
можно записать как
Customerc=newCustomer{Name="James",Age=30};
listOfFoo.Where(delegate(Foox){returnx.size>10;});
теперь можно записать как
listOfFoo.Where(x=>x.size>10);
  • Деревья выражений:
лямбда-выражения теперь могут представляться в видеструктуры данных, доступной для обхода во время выполнения, тем самым позволяя транслировать строго типизированные C#-выражения в другие домены (например, выражения SQL).
  • Неявная типизация:Вывод типов локальной переменной. Для неявной типизации вместо названиятипа данных используется ключевое словоvar. Затем уже при компиляции компилятор сам выводит тип данных исходя из присвоенного значения:var x = "hello"; вместоstring x = "hello";
  • Анонимные типы:var x = new { Name = "James" };
  • Методы расширения. Появилась возможность добавления новых методов в уже существующие классы. Реализуется с помощью ключевого словаthis при первом параметре статической функции статического класса.
publicstaticclassStringExtensions{publicstaticintToInt32(thisstringval){returnInt32.Parse(val);}}// ...strings="10";intx=s.ToInt32();
  • Автоматические свойства: компилятор сгенерирует закрытое (private) поле и соответствующиеаксессор имутатор для кода вида
publicstringName{get;privateset;}

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]
  • Возможность использования позднего связывания, для использования:
    • с языками с динамической типизацией (Python,Ruby)
    • с COM-объектами
    • отражения (reflection)
    • объектов с изменяемой структурой (DOM). Появляется ключевое словоdynamic.
  • Именованные и опциональные параметры
  • Новые возможности COM interop
  • Ковариантность и контравариантность обобщенных интерфейсов и делегатов
  • Контракты в коде (Code Contracts)
  • Библиотека параллельных задачTPL (Task Parallel Library), концепция задач и классыTask,TaskFactory,Parallel
  • Добавлен классMemoryCache, который предназначен для кэширования контента. Он похож на классCache ASP.NET, но его можно использовать при написании веб- / графических /консольных приложений.
  • Добавлено пространство именSystem.Collections.Concurrent и новые классы параллельных коллекций (ConcurrentQueue,ConcurrentStack,ConcurrentBag,…), которые предоставляют не только большую эффективность, но и более полную потокобезопасность.

Примеры:

dynamiccalc=GetCalculator();intsum=calc.Add(10,20);// Динамический вызов
publicvoidSomeMethod(intx,inty=5,intz=7);// Опциональные параметры

Версия 5.0

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

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

  • Шаблон TAP (Task-based Asynchronous Pattern). TAP использует один метод для представления инициализации и завершения асинхронной операции.
  • Асинхронные методы (async иawait) — как реализация шаблона TAP.
  • Сведения о вызывающем объекте

Версия 6.0

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

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

  • null-условные операторы. Добавлены новые операторы:?. и?[]:
int?length=customers?.Length;// null if customers is nullCustomerfirst=customers?[0];// null if customers is null
  • Функции сжатые до выражений (expression-bodied functions). Теперь определение метода может быть задано с использованием лямбда-синтаксиса:
publicPointMove(intdx,intdy)=>newPoint(x+dx,y+dy);
  • Инициализаторы автосвойств. Автосвойства теперь можно инициализировать при объявлении:
publicstringFirst{get;set;}="Jane";
  • Автосвойства только для чтения. Автосвойства теперь могут быть объявлены без сеттеров:
publicstringFirst{get;}="Jane";
  • Инициализаторы индексов. Теперь можно инициализировать не только объекты и коллекции, но и словари:
varnumbers=newDictionary<int,string>{[7]="seven",[9]="nine",[13]="thirteen"};
  • Интерполяция строк. Вместо использования конструкций сString.Format(), например:
vars=String.Format("{0} is {1} year{{s}} old",p.Name,p.Age);

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

vars=$"{p.Name} is {p.Age} year{{s}} old";
  • Фильтры исключений. Появилась возможность задавать условия для блоковcatch:
try{}catch(Exceptione)when(Log(e)){}
  • Импорт статических функций типов. Теперь доступ к статическим членам типов возможен без указания полного имени этих членов:
usingstaticSystem.Console;usingstaticSystem.Math;classProgram{staticvoidMain(){WriteLine(Sqrt(3*3+4*4));}}
  • Операторnameof. Новый оператор, который возвращает компактное строковое представление для переданного в качестве аргумента типа:
WriteLine(nameof(person.Address.ZipCode));// prints "ZipCode"
  • Для асинхронного программирования была добавлена возможность использования операторовawait внутри блоковcatch иfinally:
Resourceres=null;try{res=awaitResource.OpenAsync();// You could do this.}catch(ResourceExceptione){awaitResource.LogAsync(res,e);// Now you can do this …}finally{if(res!=null)awaitres.CloseAsync();// … and this.}

Версия 7.0

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

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

  • out-переменные, которые позволяют объявить переменные сразу в вызове метода (причем областью видимости для таких переменных является внешний блок):
p.GetCoordinates(outintx,outinty);
  • Сопоставление с шаблоном. Вводится понятие шаблона (pattern), который представляет собой синтаксическую конструкцию, позволяющую проверить соответствие переменной определённойформе и извлечь из неё информацию.
  • Шаблоны сis (is теперь может использоваться не только с типом, но и с шаблоном — в качестве правого аргумента)
  • Шаблоны и выражениеswitch. Варианты использованияswitch были расширены, теперь можно:
    • использовать любые типы (не только примитивные);
    • использовать шаблоны в выраженияхcase;
    • добавлять дополнительные условия к выражениямcase (используя ключевое словоwhen).
  • Кортежи. Добавлен типкортеж значений (структураValueTuple) и синтаксис работы с данными этого типа:
(string,string,string)LookupName(longid)// возвращаемый тип - кортеж{...// инициализируем данныеreturn(first,middle,last);// литерал кортежа}
  • Распаковкакортежей. Была добавлена новая синтаксическая конструкциядеконструктор, позволяющая извлечь кортеж, состоящий из членов класса.
  • Локальные функции. Теперь функцию, которая используется только в теле какого-либо метода, можно объявить прямо в теле этого метода.
  • Улучшения литералов. Были добавленыбинарные литералы исимвол разделителя(_) в числовых литералах.
  • Локальные переменные и возвращаемые значения по ссылке. Расширена функциональность ключевого словаref. Теперь можно возвратить данные из метода или сохранить их в локальной переменной по ссылке.
  • Расширение списка типов, возвращаемых асинхронными методами
  • Больше членов класса в виде выражений. Синтаксис функций, сжатых до выражений (expression-bodied functions), теперь применим для сеттеров, геттеров, конструкторов и деструкторов.
  • throw-выражения. Теперь можно использоватьthrow в функциях, сжатых до выражений (expression-bodied functions):
publicstringGetLastName()=>thrownewNotImplementedException();

Версия 8.0

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

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

  • Модификаторreadonly. Был создан для обозначения члена, который не изменит состояние.
  • Методы интерфейсов по умолчанию. Теперь при создании метода интерфейса можно объявить его реализацию по умолчанию, которую можно переопределить в классе, который реализует этот интерфейс.
  • Сопоставление шаблонов. Возможность позволяет работать с шаблонами в зависимости от формата в связанных, но различных типах данных.
    • Рекурсивные шаблоны. Является выражением шаблона, которое применяется к результатам другого выражения шаблона.
    • Выражения switch позволяют сократить количество case и break, а также фигурных скобок.
      publicenumRainbow{Red,Orange,Yellow,Green,Blue,Indigo,Violet}publicstaticRGBColorFromRainbow(RainbowcolorBand)=>colorBandswitch{Rainbow.Red=>newRGBColor(0xFF,0x00,0x00),Rainbow.Orange=>newRGBColor(0xFF,0x7F,0x00),Rainbow.Yellow=>newRGBColor(0xFF,0xFF,0x00),Rainbow.Green=>newRGBColor(0x00,0xFF,0x00),Rainbow.Blue=>newRGBColor(0x00,0x00,0xFF),Rainbow.Indigo=>newRGBColor(0x4B,0x00,0x82),Rainbow.Violet=>newRGBColor(0x94,0x00,0xD3),_=>thrownewArgumentException(message:"invalid enum value",paramName:nameof(colorBand)),};
    • Шаблоны свойств. Позволяет сопоставлять свойства исследуемого объекта с помощью{ variable : value } => ... .
    • Шаблоны кортежей. Используется, если нужно работать с несколькими наборами входных данных.(value1, value2,..) => ...
  • Объявлениеusing. Это объявление переменной, которому предшествует ключевое словоusing. Оно сообщает компилятору, что объявляемая переменная должна быть удалена в концеобласти видимости.
  • Статический локальный метод. Теперь можно убедиться в том, что метод не охватывает какие-либо переменные из области видимости с помощью добавления к нему модификатораstatic.
  • Удаляемые ссылочные структуры. Ссылочные структуры не могут реализоватьIDisposable (как и любые другие интерфейсы). Поэтому чтобы удалитьref struct, необходим доступныйvoid Dispose().
  • Типы значений, допускающие значениеnull. Теперь, чтобы указать, чтопеременная типа значений допускает значениеnull, необходимо поставить к имени типа?
  • Асинхронные потоки. Это во-первых интерфейсIAsyncEnumerable<T>. А во-вторых конструкцияforeach сawait.
    publicstaticasyncSystem.Collections.Generic.IAsyncEnumerable<int>GenerateSequence(){for(inti=0;i<20;i++){awaitTask.Delay(100);yieldreturni;}}// orawaitforeach(varnumberinGenerateSequence()){Console.WriteLine(number);}
  • Асинхронные высвобождаемые типы. Начиная с C# 8.0 язык поддерживает асинхронные освобождаемые типы, реализующие интерфейсSystem.IAsyncDisposable. Операнд выраженияusing может реализовыватьIDisposable илиIAsyncDisposable. В случаеIAsyncDisposable компилятор создает код дляawait, возвращенногоTask изIAsyncDisposable.DisposeAsync.
  • Индексы и диапазоны. Диапазоны и индексы обеспечивают лаконичный синтаксис для доступа к отдельным элементам или диапазонам в последовательности. Нововведение включает в себя операторы^ и.. , а такжеSystem.Index иSystem.Range
  • Оператор присваивания объединения с null. Оператор??= можно использовать для присваивания значения правого операнда левому операнду только в том случае, если левый операнд имеет значениеnull.
    List<int>numbers=null;int?i=null;numbers??=newList<int>();numbers.Add(i??=17);numbers.Add(i??=20);Console.WriteLine(string.Join(" ",numbers));// output: 17 17Console.WriteLine(i);// output: 17
  • Неуправляемые сконструированные типы. Начиная с C# 8.0, сконструированный тип значения является неуправляемым, если он содержит поля исключительно неуправляемых типов (например универсальный тип <T>).
  • Выражение stackalloc во вложенных выражениях. Теперь если результат выражения stackalloc имеет типSystem.Span<T> илиSystem.ReadOnlySpan<T>, то его можно использовать в других выражениях.
    Span<int>numbers=stackalloc[]{1,2,3,4,5,6};varind=numbers.IndexOfAny(stackalloc[]{2,4,6,8});Console.WriteLine(ind);// output: 1
  • Порядок маркеров$ и@ в интерполированных строках verbatim теперь может быть любым.

Версия 9.0

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

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

  • Типы записей. Появилась возможность при помощи ключевого словаrecord для определения ссылочного типа, предоставляющего функционал инкапсуляции данных.
    publicrecordPerson(stringFirstName,stringLastName);
    По умолчанию типы записей является неизменяемыми. В отличие от других ссылочных типов, переменные типов записей считаются равными, если равны типы и значения их свойств и полей.
    • Обратимые изменения. Для заданного экземпляра записи при помощи ключевого словаwith возможно создание копии с изменёнными значениями указанных свойств и полей.
    • Запись может быть унаследована от записи. Однако запись не может быть унаследована от класса, и наоборот, класс не может быть унаследован от записи.
  • Инициализаторы. C# 9.0 предоставляет синтаксис — ключевое словоinit — для задания значений свойств класса при инициализации.
    publicclassPerson{publicstringFirstName{get;init;}publicstringLastName{get;init;}};
  • Операторы верхнего уровня. Один файл в приложении допускается начать сразу с исполняемых строк кода, минуя ряд таких формальностей, как объявлениепространств имён,классов,методов. Такие операторы эквивалентны операторам методаMain.
  • Улучшения сопоставлений шаблонов.
    • Шаблоны типов — соответствуют объекту заданного типа.
    • Логические шаблоны — входные данные должны соответствовать заданной логической операции (and,or,not).
    • Реляционные шаблоны — входные данные должны соответствовать заданной операции сравнения (больше, меньше, равно, больше или равно, меньше или равно) с константой.
  • Улучшения производительности.
  • Допускается опустить тип создаваемого объекта в выраженииnew, если он известен заранее
    privateList<Person>persons=new();
  • Поддержка статическихлямбда-выражений и статическиханонимных методов. Как и статические локальные функции, они не могут захватывать нестатические локальные переменные и состояния экземпляра.
  • Поддержка применения атрибутов к локальным функциям.

Версия 10.0

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

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

  • Глобальные импорты. С помощью ключевого словаglobal появилась возможность определить пространства имён, которые будут импортированы глобально во всех файлах проекта.
    globalusingSystem;globalusingSystem.Collections.Generic;
  • Файловая область видимости пространства имён. Объявление пространства имён может быть применено ко всему файлу, что уменьшает уровень отступов в коде.
    namespaceMyNamespace;
  • Усовершенствованные структуры. Добавлены улучшения в работу со структурами, в том числе возможность инициализации полей непосредственно в теле структуры и поддержка параметров по умолчанию.
    publicstructPoint{publicintX{get;set;}=0;publicintY{get;set;}=0;}
  • Запечатанные интерфейсы. Интерфейсы могут быть объявлены какsealed, что предотвращает их реализацию другими интерфейсами.
    publicsealedinterfaceIMyInterface{}
  • Усовершенствованные операторы и литералы. Поддержка with-оператора для структурных типов, улучшенные string-интерполяции и другие синтаксические улучшения.
  • Улучшенное сопоставление шаблонов. Добавлены новые возможности для сопоставления шаблонов, включая шаблоны списков и возможность использования шаблонов в операторахswitch иif.
    int[]numbers={1,2,3,4,5};boolisThreeElementArray=numbersis[_,_,_];
  • Поддержка записи структуры и членов записи. Улучшена производительность при использовании структурных типов с поддержкой записи.
    publicrecordstructPoint(intX,intY);
  • Усовершенствованные атрибуты. Возможность применения атрибутов к более широкому кругу элементов, таких как локальные функции и выражения.
    [MyCustom]voidLocalFunction(){}
  • Лямбда-выражения. Поддержка более мощных и гибких лямбда-выражений, включая использование типов возврата и деструктуризацию.
    varincrement=(intx)=>x+1;
  • Усовершенствованныеasync/await. Улучшена работа с асинхронными методами, включая более эффективное управление памятью и потоками.

Версия 11.0

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

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

  • Статические виртуальные элементы в интерфейсах. Интерфейсы теперь могут включать статические виртуальные и абстрактные члены, что позволяет перегружать операторы и определять статические свойства и методы. Это упрощает реализацию универсальных математических операций.
    publicinterfaceIMyInterface<TSelf,TOther,TResult>whereTSelf:IMyInterface<TSelf,TOther,TResult>{staticabstractTResultoperator+(TSelfleft,TOtherright);}
  • Проверяемые и непроверяемые операторы. Разработчики могут определятьchecked иunchecked арифметические операторы, что позволяет компилятору вызывать правильный вариант на основе контекста.
    publicstaticcheckedintoperator+(MyTypeleft,MyTyperight){left.Value+right.Value;}
  • Оператор unsigned right-shift. Введен новый оператор>>>, который выполняет сдвиг вправо без знака, упрощая работу с целочисленными типами.
    intresult=-8>>>2;
  • Ослабленные требования к операторам смены. Второй операнд оператора сдвига больше не обязан быть типаint, что делает использование универсальных математических интерфейсов более гибким.
    MyTypevalue=newMyType();value>>=3;
  • Поддержка универсальной математики. Новые интерфейсы, такие какSystem.IAdditionOperators<TSelf, TOther, TResult>, позволяют типам реализовывать математические операции более последовательно и удобно.
    publicstructMyNumber:IAdditionOperators<MyNumber,MyNumber,MyNumber>{publicstaticMyNumberoperator+(MyNumberleft,MyNumberright){newMyNumber(left.Value+right.Value);}}
  • Расширенные возможности инициализации типов. Теперь можно задавать значения полей прямо в теле структуры и использовать параметры по умолчанию.
    publicstructPoint{publicintX{get;set;}=0;publicintY{get;set;}=0;}

Версия 12.0

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

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

  • Статические абстрактные и виртуальные методы в интерфейсах. Интерфейсы теперь могут содержать статические абстрактные и виртуальные методы, что позволяет определять поведение для универсальных математических операций.
    publicinterfaceIMyInterface<TSelf,TOther,TResult>whereTSelf:IMyInterface<TSelf,TOther,TResult>{staticabstractTResultoperator+(TSelfleft,TOtherright);staticvirtualTResultAdd(TSelfleft,TOtherright){returnleft+right;}}
  • Поддержка коллекций с неизменяемыми элементами. Введена новая коллекцияImmutableArray, которая обеспечивает неизменяемость элементов и повышение производительности.
    varimmutableArray=ImmutableArray.Create(1,2,3,4);
  • Улучшенные структуры данных. В C# 12 введены новые типы данных, такие какreadonly struct иref readonly struct, для оптимизации работы с памятью.
    publicreadonlystructPoint{publicintX{get;}publicintY{get;}publicPoint(intx,inty){X=x;Y=y;}}
  • Расширенные возможности для типов записи. Теперь записи поддерживают наследование и могут содержать методы с телами.
    publicrecordPerson(stringName){publicvirtualstringGetName()=>Name;}publicrecordEmployee(stringName,intEmployeeId):Person(Name){publicoverridestringGetName()=>$"{Name} (ID: {EmployeeId})";}
  • Поддержка типов с произвольным количеством параметров. Введены новые методы для работы с переменным числом параметров, упрощая использование таких типов в коде.
    publicvoidPrintValues(paramsint[]values){foreach(varvalueinvalues){Console.WriteLine(value);}}PrintValues(1,2,3,4);
  • Расширенные возможности компилятора. В C# 12 компилятор получил новые возможности для оптимизации и проверки кода, включая улучшенную поддержку анализаторов и генераторов исходного кода.

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

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

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

Console.WriteLine("Hello World!");

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

namespaceWindowsForms;publicclassProgram{[STAThread]publicstaticvoidMain()=>newDemoForm().ShowDialog();}publicclassDemoForm:Form{Labellabel=newLabel();publicDemoForm(){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. 12Mads 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. Архивировано 8 декабря 2022 года.
  24. Новые возможности C# 11.0  (рус.). docs.microsoft.com. Дата обращения: 1 июня 2024. Архивировано 20 декабря 2023 года.
  25. Новые возможности C# 12.0  (рус.). docs.microsoft.com. Дата обращения: 3 марта 2024. Архивировано 21 декабря 2023 года.
  26. Dot Net Anywhere . Дата обращения: 5 марта 2009. Архивировано 4 мая 2009 года.

Литература

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

Ссылки

[править |править код]
В родственных проектах
Перейти к шаблону «External links»
Ссылки на внешние ресурсы
Перейти к шаблону «Внешние ссылки» Перейти к элементу Викиданных
  Словари и энциклопедии
В библиографических каталогах
Перейти к шаблону «C Sharp»
Версии
ПО
Связанное
Перейти к шаблону «.NET»
.NET
Реализации
Архитектура
Инфраструктура
Языки Microsoft
Другие языки
Windows Foundations
Компоненты
Сравнения
Будущие технологии
Информационные ресурсы
Перейти к шаблону «Ecma International Standards»
СтандартыEcma International
Перейти к шаблону «Стандарты ISO»
СтандартыISO
1
по
9999
10000
по
19999
20000+
Перейти к шаблону «Язык программирования Си»
Компиляторы
Библиотеки
Особенности
Некоторые потомки
C и другие языки
Перейти к шаблону «Microsoft Research»
Основные
проекты
Языки программирования и компиляторы
Распределённые вычисления/Грид
Интернет исети
Другое
Операционные системы
API
Выпущено в качестве отдельного продукта
MSR Labs
Live Labs[англ.]
Актуальные
Прекращённые
FUSE Labs[англ.]
Другие подразделения
Перейти к шаблону «Свободное и открытое программное обеспечение Microsoft»
Общая информация
Программное
обеспечение
Приложения
Игры
Языки
программирования
Фреймворки и
средства разработки
Операционные
системы
Прочее
Лицензии
Связанные темы
Источник —https://ru.wikipedia.org/w/index.php?title=C_Sharp&oldid=150421653
Категории:
Скрытые категории: