C sharp
- узагальнення
- змішані типи
- Анонімні методи
- ітератори
- Нуль-типи
- Неявно тіпізіруемие локальні змінні
- Ініціалізатор об'єктів і колекцій
- Автоматична реалізація властивостей
- Анонімні типи
- методи розширення
- запити
- Лямбда-вирази
- дерева виразів
- динамічне зв'язування
- Іменовані і додаткові аргументи
- Узагальнена коваріантність і контрваріантность
- Бібліотека TPL, концепція завдань і клас Task
- клас MemoryCache
- шаблон TAP
- Асинхронні методи async і await
- Відомості про зухвалого об'єкті
- Компілятор як сервіс
- Імпорт членів статичних типів в простір імен
- фільтри винятків
- await в блоках catch / finally
- ініціалізатор автосвойств
- Значення за замовчуванням для get -Властивості
- null умовні операції (. і? [])
- інтерполяція рядків
- оператор nameof
- ініціалізатор словника
- Функції стислі до виразів
- out -змінного
- Зіставлення з шаблоном
- Шаблони з is
- Шаблони і вираз switch
- кортежі
- розпакування кортежів
- локальні функції
- покращення литералов
- Локальні змінні і повернені значення за посиланням
- Розширення списку типів, що повертаються асинхронними методами
- Більше членів класу у вигляді виразів
- throw вираження
версія 1.0
Перша версія C # нагадувала за своїми можливостями Java 1.4, кілька їх розширюючи: так, в C # були властивості (виглядають в коді як поля об'єкта. Але на ділі викликають при зверненні до них методи класу), індексатори (подібні до властивостей, але приймають параметр як індекс масиву), події. делегати. цикли foreach. структури. передаються за значенням, автоматичне перетворення вбудованих типів в об'єкти при необхідності (boxing), атрибути, вбудовані засоби взаємодії з некерованим кодом (DLL. COM) та інше.
Крім того, в C # вирішено було перенести деякі можливості C ++, відсутні в Java: беззнакові типи, перевантаження операторів (з деякими обмеженнями, на відміну від C ++), передача параметрів в метод по посиланню. методи зі змінним числом параметрів, оператор goto (з обмеженнями). Також в C # залишили обмежену можливість роботи з покажчиками - в місцях коду, спеціально позначених словом unsafe і при вказівці спеціальній опції компілятору.
версія 2.0
версія 3.0
Нові можливості у версії 3.0
В C # 3.0 з'явилися такі радикальні додавання до мови:
- ключові слова select, from, where. що дозволяють робити запити з XML документів, колекцій і т. п. Ці запити мають схожість із запитами SQL і реалізуються компонентом LINQ. (Сама фраза «language integrated query» перекладається «запит, інтегрований в мову».)
- Ініціалізація об'єкта разом з його властивостями:
можна записати як
тепер можна записати як
- Дерева виразів:
- Висновок типів локальної змінної: var x = "hello"; замість string x = "hello";
- Безіменні типи: var x = new
; - Методи-розширення - додавання методу в існуючий клас за допомогою ключового слова this при першому параметрі статичної функції.
- Автоматичні властивості: компілятор згенерує закрите (private) поле і відповідні аксессор і мутатор для коду виду
C # 3.0 сумісний з C # 2.0 за генерируемому MSIL-коду; поліпшення в мові - чисто синтаксичні та реалізуються на етапі компіляції. Наприклад, багато хто з інтегрованих запитів LINQ можна здійснити, використовуючи безіменні делегати в поєднанні з предикативними методами над контейнерами на зразок List.FindAll і List.RemoveAll.
версія 4.0
Нові можливості у версії 4.0 [16]- Можливість використання пізнього зв'язування, для використання:
- з мовами з динамічною типізацією (Python. Ruby)
- з COM-об'єктами
- відображення (reflection)
- об'єктів із змінною структурою (DOM). З'являється ключове слово dynamic.
- Іменовані і опціональні параметри
- Нові можливості COM interop
- Коваріантність і контраваріантних узагальнених інтерфейсів і делегатів
- Контракти в коді (Code Contracts)
- Бібліотека паралельних завдань TPL (Task Parallel Library), концепція завдань і класи Task. TaskFactory. Parallel
- Доданий клас MemoryCache. який призначений для кешування контенту. Він схожий на клас Cache ASP.NET, але його можна використовувати при написанні веб- / графічних / консольних додатків.
версія 5.0
Нові можливості у версії 5.0
- Шаблон TAP (Task-based Asynchronous Pattern). TAP використовує один метод для подання ініціалізації і завершення асинхронної операції.
- Асинхронні методи (async і await) - як реалізація шаблону TAP.
версія 6.0
Нові можливості у версії 6.0
- null умовні операції (. і? [])
- Функції стислі до виразів (expression-bodied functions)
- ініціалізатор властивостей
- ініціалізатор індексів
- інтерполяція рядків
- фільтри винятків
- Імпорт статичних функцій з класу
- оператор nameof
- await всередині блоків catch і finally
версія 7.0
Нові можливості у версії 7.0 [13]
- out -змінного, які дозволяють оголосити змінні відразу у виклику методу (причому областю видимості для таких змінних є зовнішній блок):
- Зіставлення з шаблоном. Вводиться поняття шаблону (pattern), який являє собою синтаксичну конструкцію, що дозволяє перевірити відповідність змінної певній формі і витягти з неї інформацію.
- Шаблони з is (is тепер може використовуватися не тільки з типом, але і з шаблоном - як правого аргументу)
- Шаблони і вираз switch. Варіанти використання switch були розширені, тепер можна:
- використовувати будь-які типи (не лише примітивні);
- використовувати шаблони в виразах case;
- додавати додаткові умови до виразів case (використовуючи ключове слово when).
- Кортежі. Додано новий значущий тип кортеж і синтаксис роботи з даними цього типу:
- Розпакування кортежів. Була додана нова синтаксична конструкція Деконструктор. що дозволяє витягти кортеж, що складається з членів класу.
- Локальні функції. Тепер функцію, яка використовується тільки в тілі будь-якого методу можна оголосити прямо в тілі цього методу.
- Покращення литералов. Були додані бінарні літерали і символ роздільник (_) в числових літералах.
- Локальні змінні і повернені значення за посиланням. Розширено функціональність ключового слова ref. Тепер можна повернути дані з методу або зберегти їх в локальній змінній по посиланню.
- Розширення списку типів, що повертаються асинхронними методами
- Більше членів класу у вигляді виразів. Синтаксис функцій стислих до виразів (expression-bodied functions) тепер застосуємо для сеттерів, геттеров, конструкторів і деструкторів.
- throw -виражена. Тепер можна використовувати throw у функціях стислих до виразів (expression-bodied functions):
Приклад «Hello, World!»
Нижче представлений код класичної програми «Hello world» на C # для консольного застосування: