C Sharp
| С# | |
|---|---|
| Класс языка | |
| Появился в | 2001 |
| Автор | Андерс Хейлсберг |
| Разработчик | .NET Foundation |
| Расширение файлов | .cs или.csx |
| Выпуск | 14 (11 ноября2025 года) |
| Система типов | статическая,динамическая,строгая,безопасная,вывод типов |
| Основные реализации | .NET Framework,Mono,.NET,DotGNU (заморожен),Universal Windows Platform |
| Диалекты | Cω,Spec#,Polyphonic C#[англ.],Enhanced C# |
| Испытал влияние | C++,Java[1][2][3],Delphi,Модула-3 иSmalltalk |
| Повлиял на | Cω,F#,Nemerle,Vala,Windows PowerShell,Kotlin |
| Лицензия | КомпиляторRoslyn:лицензия MIT[4] КомпиляторMono: dualGPLv3 and MIT/X11 |
| Сайт | docs.microsoft.com/ru-ru… |
| Платформа | Common Language Infrastructure |
C# (произноситсяси шарп) —объектно-ориентированныйязык программирования общего назначения. Разработан в1998—2001 годах группой инженеров компании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# и др.
Название языка
[править |править код]
Название «Си шарп» (от англ. sharp — диез) происходит отбуквенной музыкальной нотации, где латинской буквеC соответствует нотаДо, а знакдиез (англ. sharp) означает повышение соответствующего нотезвука наполутон[7], что аналогично названию языкаC++, где «++» обозначаетинкрементпеременной. Название также является игрой с цепочкойC →C++ → C++++(C#), так как символ «#» можно представить состоящим из 4 знаков «+»[8].
Из-за технических ограничений на отображение (стандартные шрифты, браузеры и т. д.), а также из-за того, что знак диеза ♯ не представлен на стандартнойклавиатуре компьютера, при записи имени языка программирования используютзнак решётки (#)[9]. Это соглашение отражено в Спецификации языка C# ECMA-334[10]. Тем не менее, на практике (например, при размещении рекламы и коробочном дизайне[11]), «Майкрософт» использует знак диеза.
Названия языков программирования не принято переводить, поэтому язык называют, используя транскрипцию, — «Си шарп».
Стандартизация
[править |править код]C# стандартизирован вECMA (ECMA-334)[12] иISO (ISO/IEC 23270)[13].
Известно как минимум о трёх независимых реализациях C#, базирующихся на этой спецификации и находящихся в настоящее время на различных стадиях разработки:
- Mono, начата компаниейXimian, продолжена её покупателем и преемникомNovell, а затемXamarin.
- dotGNU иPortable.NET, разрабатываемыеFree Software Foundation.
Версии
[править |править код]На протяжении разработки языка C# было выпущено несколько его версий:
| Версия | Нововведения |
|---|---|
| C# 2.0 |
|
| C# 3.0 |
|
| C# 4.0 |
|
| C# 5.0 |
|
| C# 6.0 |
|
| C# 7.0[17] |
|
| C# 8.0 |
|
| C# 9.0 |
|
| C# 10.0 |
|
| C# 11.0 |
|
Версия 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]
- Возможность использования позднего связывания, для использования:
- Именованные и опциональные параметры
- Новые возможности COM interop
- Ковариантность и контравариантность обобщенных интерфейсов и делегатов
- Контракты в коде (Code Contracts)
- Библиотека параллельных задачTPL (Task Parallel Library), концепция задач и классы
Task,TaskFactory,Parallel - Добавлен класс
MemoryCache, который предназначен для кэширования контента. Он похож на классCacheASP.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#:
- КомпиляторRoslyn c открытымисходным кодом
- Реализация C# в виде компилятора csc.exe включена в состав.NET Framework (включая.NET Micro Framework,.NET Compact Framework и его реализации подSilverlight иWindows Phone 7).
- В составе проекта Rotor (Shared Source Common Language Infrastructure)компании Microsoft.
- ПроектMono включает в себя реализацию C# с открытымисходным кодом.
- ПроектDotGNU также включает компилятор C# с открытым кодом.
- DotNetAnywhere[26] — ориентированная навстраиваемые системы реализация CLR, поддерживает практически всю спецификацию C# 2.0.
Примечания
[править |править код]- ↑«Поскольку язык С# унаследовал свой синтаксис от C++ и Java…»Трей Нэш. C# 2010: ускоренный курс для профессионалов = Accelerated C# 2010. —М.: Вильямс, 2010. — С. 17. — 592 с. —ISBN 978-5-8459-1638-9.
- ↑«Язык C# <…> унаследовал много полезных возможностей от других языков программирования и напрямую связан с двумя наиболее широко применяемыми в мире компьютерными языками — C и C++, а также с языком Java», однако далее:«Связь между C# и Java более сложная. Оба языка разработаны для создания переносимого кода, базируются на C и C++, используют их синтаксис и объектную модель. Однако между этими языками нет прямой связи, они больше похожи на двоюродных братьев, имеющих общих предков, но отличающихся многими признаками»Герберт Шилдт. C# учебный курс = C#. A Beginner's Guide. —М.:Питер, 2003. — С. 20. —ISBN 966-552-121-7.
- ↑Герберт Шилдт. Полный справочник по С# = C#: The Complete Reference. —М.: Издательский дом «Вильямс», 2004. — С. 26—27. — 752 с. —ISBN 5-8459-0563-X.
- ↑Лицензия (Roslyn) в репозитории Github . Дата обращения: 4 января 2022. Архивировано 4 января 2022 года.
- ↑Лицензия (.NET CLR) в репозитории Github . Дата обращения: 4 января 2022. Архивировано 4 января 2022 года.
- ↑Либерти Д. Язык программирования C# // Программирование на C#. — Санкт-Петербург. — 2003: Символ-Плюс, 2003. — С. 26. — 688 с. —ISBN 5-93286-038-3.
- ↑Kovacs, James. C#/.NET History Lesson (англ.) (7 сентября 2007). Дата обращения: 23 марта 2011. Архивировано 21 августа 2011 года.
- ↑The A-Z of Programming Languages: C# (англ.). computerworld.com.au (1 октября 2008). Дата обращения: 2 сентября 2014. Архивировано изоригинала 2 апреля 2015 года.
- ↑Microsoft C# FAQ . Microsoft. Дата обращения: 25 марта 2008. Архивировано изоригинала 30 апреля 2003 года.
- ↑C# Language Specification. — 4th. —Ecma International, 2006. — [Архивировано 2 декабря 2012 года.]Архивированная копия . Дата обращения: 26 января 2011. Архивировано 2 декабря 2012 года.
- ↑Visual C#.net Standard (JPEG). Microsoft (4 сентября 2003). Дата обращения: 18 июня 2009. Архивировано 21 августа 2011 года.
- ↑Standard ECMA-334 C# Language Specification, 4rd edition (англ.). Ecma International (июнь 2006). Дата обращения: 16 мая 2017. Архивировано 31 октября 2010 года.
- ↑ISO/IEC 23270:2003 Information technology -- C# Language Specification (англ.). International Organization for Standardization (апрель 2003). Дата обращения: 16 мая 2017. Архивировано 5 августа 2017 года.
- ↑Спецификация по Microsoft C# 2.0 содержит описание лишь новых возможностей версии 2.0. Особенности версии описаны в спецификации 1.2, приведенной выше.
- ↑Для версий языка C# 3.0, 4.0 и 5.0 пока нет утверждённых ECMA или ISO/IEC спецификаций.
- ↑Заметки релиза Visual Studio 2022 17.8 . Microsoft Learn. Дата обращения: 29 июня 2023. Архивировано 6 августа 2023 года.
- ↑12Mads Torgersen. New Features in C# 7.0 (англ.). .NET Blog. Microsoft (9 марта 2017). Дата обращения: 7 мая 2017. Архивировано 11 апреля 2017 года.
- ↑Differences Between C++ Templates and C# Generics (C# Programming Guide) (англ.). Microsoft (17 декабря 2016). Дата обращения: 16 мая 2017. Архивировано 7 августа 2021 года.
- ↑Anders Hejlsberg - Programming data in C# 3.0 (англ.). The Channel 9 Team. Microsoft (16 июня 2004). Дата обращения: 16 мая 2017. Архивировано 12 ноября 2018 года.
- ↑Visual Studio 2010: примеры для C# 4.0 . Microsoft (17 июля 2012). Дата обращения: 16 мая 2017. Архивировано 28 февраля 2017 года.
- ↑Новые возможности C# 8.0 (рус.). docs.microsoft.com. Дата обращения: 11 июня 2020. Архивировано 8 августа 2020 года.
- ↑Новые возможности C# 9.0 (рус.). docs.microsoft.com. Дата обращения: 29 апреля 2023. Архивировано 8 декабря 2022 года.
- ↑Новые возможности C# 10.0 (рус.). docs.microsoft.com. Дата обращения: 11 апреля 2023. Архивировано 8 декабря 2022 года.
- ↑Новые возможности C# 11.0 (рус.). docs.microsoft.com. Дата обращения: 1 июня 2024. Архивировано 20 декабря 2023 года.
- ↑Новые возможности C# 12.0 (рус.). docs.microsoft.com. Дата обращения: 3 марта 2024. Архивировано 21 декабря 2023 года.
- ↑Dot Net Anywhere . Дата обращения: 5 марта 2009. Архивировано 4 мая 2009 года.
Литература
[править |править код]- Джон Скит. C# для профессионалов: тонкости программирования, 3-е издание, новый перевод = C# in Depth, 3rd ed.. —М.:«Вильямс», 2014. — 608 с. —ISBN 978-5-8459-1909-0.
- Кристиан Нейгел и др. C# 5.0 и платформа .NET 4.5 для профессионалов = Professional C# 5.0 and .NET 4.5. —М.:«Диалектика», 2013. — 1440 с. —ISBN 978-5-8459-1850-5.
- А. Хейлсберг, М. Торгерсен, С. Вилтамут, П. Голд. Язык программирования C#. Классика Computers Science. 4-е издание = C# Programming Language (Covering C# 4.0), 4th Ed. —СПб.:«Питер», 2012. — 784 с. —ISBN 978-5-459-00283-6. — [Архивировано 10 октября 2011 года.]
- Э. Стиллмен, Дж. Грин. Изучаем C#. 2-е издание = Head First C#, 2ed. —СПб.:«Питер», 2012. — 704 с. —ISBN 978-5-4461-0105-4. (недоступная ссылка)
- Эндрю Троелсен. Язык программирования C# 5.0 и платформа .NET 4.5, 6-е издание = Pro C# 5.0 and the .NET 4.5 Framework, 6th edition. —М.:«Вильямс», 2013. — 1312 с. —ISBN 978-5-8459-1814-7.
- Джозеф Албахари, Бен Албахари. C# 6.0. Справочник. Полное описание языка = C# 6.0 in a Nutshell: The Definitive Reference. —М.:«Вильямс», 2018. — 1040 с. —ISBN 978-5-8459-2087-4. —ISBN 978-1-491-92706-9.
- Герберт Шилдт. C# 4.0: полное руководство = C# 4.0 The Complete Reference. —М.:«Вильямс», 2010. — С. 1056. —ISBN 978-5-8459-1684-6.
- Кристиан Нейгел, Карли Уотсон и др. Visual C# 2010: полный курс = Beginning Microsoft Visual C# 2010. —М.:Диалектика, 2010. —ISBN 978-5-8459-1699-0.
Ссылки
[править |править код]- Языки программирования по алфавиту
- Языки программирования, появившиеся в 2001 году
- .NET
- Microsoft Research
- Свободное и открытое программное обеспечение Microsoft
- Семейство языков программирования C Sharp
- Языки программирования семейства Си
- Языки программирования платформы .NET
- Языки веб-программирования
- Языки программирования с автоматическим управлением памятью
- Высокоуровневые языки программирования
- Страницы, использующие устаревший тег source
- Википедия:Cite web (не указан язык)
- Википедия:Cite web (заменить webcitation-архив: deadlink no)
- Страницы, использующие волшебные ссылки ISBN
- ПРО:ИТ:Статьи по алфавиту
- ПРО:ИТ:Последняя правка: в прошлом году
- Википедия:Статьи с нерабочими ссылками
- Статьи со ссылками на Викиучебник
- Статьи со ссылками на Викисклад