C# (вимовляється «сі шарп») — об'єктно-орієнтована мова програмування. Розроблений в 1998-2001 роках групою інженерів під керівництвом Андерса Хейлсберга в компанії Microsoft як мова розробки додатків для платформи Microsoft .NET Framework і згодом був стандартизований як ECMA-334 та ISO/IEC 23270.
C# відноситься до сім'ї мов з C-подібним синтаксисом, з них синтаксис найбільш близький до C++ і Java. Мова має статичну типізацію, підтримує поліморфізм, перевантаження операторів (у тому числі операторів явного і неявного приведення типу), делегати, атрибути, події, властивості, узагальнені типи і методи, ітератори, анонімні функції з підтримкою замикань, LINQ, виключення, коментарі у форматі XML.
Перейнявши багато чого від своїх попередників — мов C++, Pascal, Модула, Smalltalk і, в особливості, Java — С#, спираючись на практику їх використання, виключає деякі моделі, що зарекомендували себе як проблематичні при розробці програмних систем, наприклад, 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# і ін.
Назва «Сі шарп» (від англ. sharp — дієз) походить від музичної нотації, де знак дієз означає підвищення відповідного ноті звука на півтон[4], що аналогічно назві мови C++, де «++» позначає інкремент змінної. Назва також є грою з ланцюжком C → C++ → C++++(C#), так як символ «#» можна скласти з 4-х знаків «+».[]
Внаслідок технічних обмежень на відображення (стандартні шрифти, браузери тощо) і тієї обставини, що знак дієз ♯ не представлений на стандартній клавіатурі, знак номера # був обраний для представлення знака дієз при запису імені мови програмування.[] Це угода відображено в Специфікації Мови C# ECMA-334.[] Тим не менш, на практиці (наприклад, при розміщенні реклами і коробковому дизайні[8]), Майкрософт використовує призначений музичний знак.
Назви мов програмування не прийнято переводити, тому мову слід називати по-англійськи «Сі шарп».
C# стандартизований в ECMA (ECMA-334)[] та ISO (ISO/IEC 23270)[].
Відомо як мінімум про три незалежних реалізаціях C#, що базуються на цій специфікації і знаходяться в даний час на різних стадіях розробки: Mono, розпочато компанією Ximian, продовжена її покупцем і наступником Novell, а потім Xamarin. dotGNU і Portable.NET, розробляються Free Software Foundation.
Проект 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 Часткові типи (поділ реалізації класу більш ніж на один файл). Узагальнені, або параметризрвані типи (узагальнення). На відміну від шаблонів C++, вони підтримують деякі додаткові можливості і працюють на рівні віртуальної машини. Разом з тим, параметрами узагальненого типу не можуть бути вирази, вони не можуть бути повністю або частково спеціалізовані, не підтримують шаблонних параметрів за замовчуванням, від шаблонного параметра не можна успадковуватись, і т. д.[] Нова форма ітератора, що дозволяє створювати співпрограми з допомогою ключового слова 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.[14] У вересні 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" перекладається "запит, інтегрований в мову".) Ініціалізація об'єкта разом з його властивостями:
Customer c = new Customer(); c.Name = "James"; c.Age=30;
можна записати як
Customer c = new Customer { Name = "James", Age = 30 };
Дерева виразів: лямбда-виразу тепер можуть представлятися у вигляді структури даних, доступної для обходу під час виконання, тим самим дозволяючи транслювати строго типізовані 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 генеруємому HTML-коду; поліпшення в мові — чисто синтаксичні і реалізуються на етапі компіляції. Наприклад, багато хто з інтегрованих запитів 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[] Можливість використання пізнього зв'язування, для використання: з мовами з динамічною типізацією (Python, Ruby) з COM-об'єктами відображення (reflection) об'єктів із змінною структурою (DOM). З'являється ключове слово dynamic. Іменовані і необов'язкові параметри Нові можливості COM interop Коваріантного і контравариантность Контракти в коді (Code Contracts)
Приклади: dynamic calc = GetCalculator(); int sum = calc.Add(10, 20); // Динамічний виклик public void SomeMethod(int x, int y = 5, int z = 7); // Необов'язкові параметри
Існує декілька реалізацій 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[] — орієнтована на вбудовувані системи реалізація CLR, підтримує практично всю специфікацію C# 2.0.