C# 
C# (произносится си шарп) — объектно-ориентированный язык программирования. Разработан в 1998—2001 годах группой инженеров под руководством Андерса Хейлсберга в компании Microsoft как язык разработки приложений для платформы Microsoft .NET Framework и впоследствии был стандартизирован как ECMA-334 и ISO/IEC 23270.
C# относится к семье языков с C-подобным синтаксисом, из них его синтаксис наиболее близок к C++ и Java. Язык имеет статическую типизацию, поддерживает полиморфизм, перегрузку операторов (в том числе операторов явного и неявного приведения типа), делегаты, атрибуты, события, свойства, обобщённые типы и методы, итераторы, анонимные функции с поддержкой замыканий, LINQ, исключения, комментарии в формате XML.
Переняв многое от своих предшественников — языков C++, Java, Delphi, Модула и Smalltalk — С#, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например, C# не поддерживает множественное наследование классов (в отличие от C++).
Содержание |
C# разрабатывался как язык программирования прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C#, которая отражает BCL. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслирована в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C#; подобного взаимодействия следует ожидать и в дальнейшем. (Однако эта закономерность была нарушена с выходом C# 3.0, представляющего собой расширения языка, не опирающиеся на расширения платформы .NET.) CLR предоставляет C#, как и всем другим .NET-ориентированным языкам, многие возможности, которых лишены «классические» языки программирования. Например, сборка мусора не реализована в самом C#, а производится CLR для программ, написанных на C# точно так же, как это делается для программ на VB.NET, J# и др.
Название «Си шарп» (До диез) происходит от музыкальной нотации, где знак диез, прибавляемый к основному обозначению ноты, означает повышение соответствующего этой ноте звука на полутон.[4] Это аналогично названию языка C++, где «++» обозначает, что переменная должна быть увеличена на 1.
Вследствие технических ограничений на отображение (стандартные шрифты, браузеры и т. д.) и того обстоятельства, что знак диез ♯ не представлен на стандартной клавиатуре, знак номера # был выбран для представления знака диез при записи имени языка программирования.[5] Это соглашение отражено в Спецификации Языка C# ECMA-334.[6] Тем не менее, на практике (например, при размещении рекламы и коробочном дизайне[7]), Майкрософт использует предназначенный музыкальный знак.
Названия языков программирования не принято переводить, поэтому зачастую язык называют по-английски «Си шарп».
C# стандартизирован в ECMA (ECMA-334)[8] и ISO (ISO/IEC 23270)[9].
Известно, как минимум, о трёх независимых реализациях C#, базирующихся на этой спецификации и находящихся в настоящее время на различных стадиях разработки:
- Mono, начата компанией Ximian и продолжена её покупателем и преемником Novell.
- dotGNU и Portable.NET, разрабатываемые Free Software Foundation.
На протяжении разработки языка C# было выпущено несколько его версий:
| Версия | Спецификация языка | Дата | .NET Framework | Visual Studio | ||
|---|---|---|---|---|---|---|
| ECMA | ISO/IEC | Microsoft | ||||
| C# 1.0 | Декабрь 2002 | Апрель 2003 | Январь 2002 | Январь 2002 | .NET Framework 1.0 | Visual Studio .NET 2002 |
| C# 1.2 | Октябрь 2003 | Апрель 2003 | .NET Framework 1.1 | Visual Studio .NET 2003 | ||
| C# 2.0 | Июнь 2006 | Сентябрь 2006 | Сентябрь 2005[10] | Ноябрь 2005 | .NET Framework 2.0 | Visual Studio 2005 |
| C# 3.0 | Отсутствует[11] | Август 2007 | Ноябрь 2007 | .NET Framework 3.5 | Visual Studio 2008 | |
| C# 4.0 | Апрель 2010 | Апрель 2010 | .NET Framework 4 | Visual Studio 2010 | ||
| C# 2.0 | C# 3.0 | C# 4.0 | C# 4.5 (запланирован) | |
|---|---|---|---|---|
| Новые возможности |
|
|
|
|
Проект 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 и при указании специальной опции компилятору.
Проект спецификации C# 2.0 впервые был опубликован Microsoft в октябре 2003 года; в 2004 году выходили бета-версии (проект с кодовым названием Whidbey), C# 2.0 окончательно вышел 7 ноября 2005 года вместе с Visual Studio 2005 и .NET 2.0.
- Новые возможности в версии 2.0
- Частичные типы (разделение реализации класса более чем на один файл).
- Обобщённые, или параметризованные типы (generics). В отличие от шаблонов C++, они поддерживают некоторые дополнительные возможности и работают на уровне виртуальной машины. Вместе с тем, параметрами обобщённого типа не могут быть выражения, они не могут быть полностью или частично специализированы, не поддерживают шаблонных параметров по умолчанию, от шаблонного параметра нельзя наследоваться, и т. д.[12]
- Новая форма итератора, позволяющая создавать сопрограммы с помощью ключевого слова
yield, подобно Python и Ruby. - Анонимные методы, обеспечивающие функциональность замыкания.
- Оператор '??':
return obj1 ?? obj2;означает (в нотации C# 1.0)return obj1!=null ? obj1 : obj2;. - Обнуляемые ('nullable') типы-значения (обозначаемые вопросительным знаком, например,
int? i = null;), представляющие собой те же самые типы-значения, способные принимать также значениеnull. Такие типы позволяют улучшить взаимодействие с базами данных через язык SQL. - Возможность создавать хранимые процедуры, триггеры и даже типы данных на .Net языках (в том числе и на C#).
- Поддержка 64-разрядных вычислений, что кроме всего прочего, позволяет увеличить адресное пространство и использовать 64-разрядные примитивные типы данных.
В июне 2004 года Андерс Хейлсберг впервые рассказал на сайте Microsoft о планируемых расширениях языка в C#3.0.[13] В сентябре 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, позволяющие делать запросы из SQL, XML, коллекций и т. п. (запрос, интегрированный в язык, Language Integrated Query, или LINQ) - Инициализация объекта вместе с его свойствами:
-
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).
- Вывод типов локальной переменной:
var x = "hello";вместоstring x = "hello"; - Безымянные типы:
var x = new { Name = "James" }; - Методы-расширения — добавление метода в существующий класс с помощью ключевого слова
thisпри первом параметре статической функции.
public static class StringExtensions { public static int ToInt32(this string val) { return Int32.Parse(val); } } // ... string s = "10"; int x = s.ToInt32();
- Автоматические свойства: компилятор сгенерирует закрытое (private) поле и соответствующие аксессор и мутатор для кода вида
public string Name { get; private set; }
C# 3.0 совместим с C# 2.0 по генерируемому MSIL-коду; улучшения в языке — чисто синтаксические и реализуются на этапе компиляции. Например, многие из интегрированных запросов LINQ можно осуществить, используя безымянные делегаты в сочетании с предикатными методами над контейнерами вроде List.FindAll и List.RemoveAll.
Превью C# 4.0 было представлено в конце 2008 года, вместе с CTP-версией Visual Studio 2010.
Visual Basic 10.0 и C# 4.0 были выпущены в апреле 2010 года, одновременно с выпуском Visual Studio 2010.
- Новые возможности в версии 4.0[14]
- Возможность использования позднего связывания, для использования:
- Именованные и опциональные параметры
- Новые возможности COM interop
- Ковариантность и контрвариантность
- Контракты в коде (Code Contracts)
Примеры:
dynamic calc = GetCalculator(); int sum = calc.Add(10, 20); // Динамический вызов
public void SomeMethod(int x, int y = 5, int z = 7); // Опциональные параметры
Ниже представлен код классической программы «Hello world» на C# для консольного приложения:
using System; namespace Example { class Program { static void Main() { Console.WriteLine("Hello World!"); // Вывод заданного текста в консоль Console.ReadKey(); // Ожидание нажатия клавиши пользователем } } }
и код этой же программы для приложения Windows Forms:
using System; using System.Windows.Forms; namespace WindowsFormsApplication1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) // Элементы label и button добавлены предварительно { label1.Text = "Hello, World!"; } } }
Существует несколько реализаций 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[15] — ориентированная на встраиваемые системы реализация CLR, поддерживает практически всю спецификацию C# 2.0.
- ↑ «Поскольку язык С# унаследовал свой синтаксис от C++ и Java…» (Трей Нэш «C# 2010: ускоренный курс для профессионалов» («Accelerated C# 2010») — М.: Вильямс, 2010. — С. 592. — ISBN 978-5-8459-1638-9; стр. 17)
- ↑ «Язык C# … унаследовал много полезных возможностей от других языков программирования и напрямую связан с двумя наиболее широко применяемыми в мире компьютерными языками — C и C++, а также с языком Java.», однако далее: «Связь между C# и Java более сложная. Оба языка разработаны для создания переносимого кода, базируются на C и C++, используют их синтаксис и объектную модель. Однако между этими языками нет прямой связи, они больше похожи на двоюродных братьев, имеющих общих предков, но отличающихся многими признаками.» (Герберт Шилдт «C# учебный курс». — М.: Питер. 2003. — стр. 20).
- ↑ Герберт Шилдт Полный справочник по С#. : Пер. с англ. — М. : Издательский дом "Вильямс", 2004. — 752 с. : ил. — Парал. тит. англ. ISBN 5-8459-0563-X (рус.) стр. 26-27.
- ↑ Kovacs, James C#/.NET History Lesson (September 7, 2007). Архивировано из первоисточника 21 августа 2011. Проверено 23 марта 2011.
- ↑ Microsoft C# FAQ. Microsoft.(недоступная ссылка) Проверено 25 марта 2008.(недоступная ссылка — история)
- ↑ C# Language Specification. — 4th. — ECMA International, 2006.
- ↑ Visual C#.net Standard (JPEG). Microsoft (September 4, 2003). Архивировано из первоисточника 21 августа 2011. Проверено 18 июня 2009.
- ↑ Standard ECMA-334 C# Language Specification, 4rd edition (June 2006)
- ↑ ISO/IEC 23270:2003, Information technology — C# Language Specification
- ↑ Спецификация по Microsoft C# 2.0 содержит описание лишь новых возможностей версии 2.0. Особенности версии описаны в спецификации 1.2, приведенной выше.
- ↑ Для версий языка C# 3.0 и 4.0 пока нет утвержденных ECMA или ISO/IEC спецификаций.
- ↑ Differences Between C++ Templates and C# Generics (C# Programming Guide)
- ↑ MSDN News
- ↑ C# Future
- ↑ Dot Net Anywhere
- Эндрю Троелсен. Язык программирования C# 2010 и платформа .NET 4.0 = Pro C# 2010 and the .NET 4.0 Platform. — 5-е изд. — М.: Вильямс, 2010. — С. 1392. — ISBN 978-5-8459-1682-2
- Герберт Шилдт. C# 4.0: полное руководство = C# 4.0 The Complete Reference. — М.: «Вильямс», 2010. — С. 1056. — ISBN 978-5-8459-1684-6
- Джон Скит. C#: программирование для профессионалов, 2-е издание = C# in Depth, 2nd Edition. — М.: «Вильямс», 2011. — 544 с. — ISBN 978-5-8459-1555-9
- Кристиан Нейгел, Карли Уотсон и др. Visual C# 2010: полный курс = Beginning Microsoft Visual C# 2010. — М.: Диалектика, 2010. — ISBN 978-5-8459-1699-0
- Трей Нэш. C# 2010: ускоренный курс для профессионалов = Accelerated C# 2010. — М.: Вильямс, 2010. — С. 592. — ISBN 978-5-8459-1638-9
- Кристиан Нейгел, Билл Ивьен, Джей Глинн, Карли Уотсон, Морган Скиннер. C# 4: Платформа .NET 4 для профессионалов = Professional C# 4 and .NET 4. — М.: Диалектика, 2010. — С. 1440. — ISBN 978-5-8459-1656-3
- Основные материалы по Visual C#
- Руководство по программированию на C#
- Язык C# (инструкции по C#)
- Практическое руководство. Создание приложений Windows Forms на C#
- Доклад, подробно описывающий новшества в языке С# версии 4.0
