C Sharp

Материал из Википедии — свободной энциклопедии
Перейти к: навигация, поиск
Правильный заголовок этой статьи — C#. Он показан некорректно из-за технических ограничений.
С#
Семантика:

императивный

Класс языка:

мультипарадигменный:
объектно-ориентированный,
обобщённый, процедурный, функциональный, событийный, рефлективный

Появился в:

2000

Автор:

Андерс Хейлсберг

Выпуск:

6.0 (20 июля 2015)

Система типов:

статическая, динамическая, строгая, утиная, вывод типов

Основные реализации:

Visual C#, .NET Framework, Mono, DotGNU

Диалекты:

, Spec#, Polyphonic C#

Испытал влияние:

C++, Java[1][2][3], Delphi, Модула и Smalltalk

Повлиял на:

, F#, Nemerle, Vala, Windows PowerShell, Kotlin

C# (произносится «си шарп») — объектно-ориентированный язык программирования. Разработан в 19982001 годах группой инженеров под руководством Андерса Хейлсберга в компании 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х знаков «+».[5]

Вследствие технических ограничений на отображение (стандартные шрифты, браузеры и т. д.) и того обстоятельства, что знак диез ♯ не представлен на стандартной клавиатуре, знак номера # был выбран для представления знака диез при записи имени языка программирования.[6] Это соглашение отражено в Спецификации Языка C# ECMA-334.[7] Тем не менее, на практике (например, при размещении рекламы и коробочном дизайне[8]), Майкрософт использует предназначенный музыкальный знак.

Названия языков программирования не принято переводить, поэтому язык следует называть по-английски «Си шарп».

Стандартизация[править | править вики-текст]

C# стандартизирован в ECMA (ECMA-334)[9] и ISO (ISO/IEC 23270)[10].

Известно как минимум о трёх независимых реализациях C#, базирующихся на этой спецификации и находящихся в настоящее время на различных стадиях разработки:

Версии[править | править вики-текст]

На протяжении разработки языка 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[11] Ноябрь 2005 .NET Framework 2.0 Visual Studio 2005
C# 3.0 Отсутствует[12] Август 2007 Ноябрь 2007 .NET Framework 3.5 Visual Studio 2008
C# 4.0 Апрель 2010 Апрель 2010 .NET Framework 4 Visual Studio 2010
C# 5.0 Июнь 2013 Август 2012 .NET Framework 4.5 Visual Studio 2012
C# 6.0 Отсутствует Июль 2015 Июль 2015 .NET Framework 4.6 Visual Studio 2015
Общая информация по версиям
C# 2.0 C# 3.0 C# 4.0 C# 5.0 C# 6.0
Новые
возможности
  • Обобщения
  • Смешанные типы
  • Анонимные методы
  • Итераторы
  • Нуль-типы
  • Неявно типизируемые локальные переменные
  • Инициализаторы объектов и коллекций
  • Автоматическая реализация свойств
  • Анонимные типы
  • Методы расширения
  • Запросы
  • Лямбда-выражения
  • Деревья выражений
  • Асинхронные методы
  • Сведения о вызывающем объекте
  • Компилятор как сервис
  • Импорт членов статических типов в пространство имён
  • Фильтры исключений
  • Await в блоках catch/finally
  • Инициализаторы авто-свойств
  • Значения по умолчанию для get-свойств
  • Интерполяция строк
  • Оператор nameof
  • Инициализатор словаря

Версия 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++, они поддерживают некоторые дополнительные возможности и работают на уровне виртуальной машины. Вместе с тем, параметрами обобщённого типа не могут быть выражения, они не могут быть полностью или частично специализированы, не поддерживают шаблонных параметров по умолчанию, от шаблонного параметра нельзя наследоваться, и т. д.[13]
  • Новая форма итератора, позволяющая создавать сопрограммы с помощью ключевого слова yield, подобно Python и Ruby.
  • Анонимные методы, обеспечивающие функциональность замыкания.
  • Оператор '??': 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.[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, позволяющие делать запросы из 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.

Версия 4.0[править | править вики-текст]

Превью C# 4.0 было представлено в конце 2008 года, вместе с CTP-версией Visual Studio 2010.

Visual Basic 10.0 и C# 4.0 были выпущены в апреле 2010 года, одновременно с выпуском Visual Studio 2010.

Новые возможности в версии 4.0[15]
  • Возможность использования позднего связывания, для использования:
    • с языками с динамической типизацией (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); // Опциональные параметры

Пример «Hello, World!»[править | править вики-текст]

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

using System;

namespace Example
{
    class Program
    {
        static void Main()
        {
            Console.WriteLine("Hello World!"); // Вывод заданного текста в консоль
            Console.ReadKey(); // Ожидание нажатия клавиши пользователем
        }
    }
}

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

// assembly: System.dll
// assembly: System.Drawing.dll
// assembly: System.Windows.Forms.dll
using System;
using System.Drawing;
using System.Windows.Forms;

namespace WindowsForms
{
    public class Program
    {
        [STAThread]
        public static void Main()
        {
            new DemoForm().ShowDialog();
        }
    }

    public class DemoForm : Form
    {
        Label label = new Label();

        public DemoForm()
        {
            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. — С. 592. — ISBN 978-5-8459-1638-9; стр. 17)
  2. «Язык C# … унаследовал много полезных возможностей от других языков программирования и напрямую связан с двумя наиболее широко применяемыми в мире компьютерными языками — C и C++, а также с языком Java.», однако далее: «Связь между C# и Java более сложная. Оба языка разработаны для создания переносимого кода, базируются на C и C++, используют их синтаксис и объектную модель. Однако между этими языками нет прямой связи, они больше похожи на двоюродных братьев, имеющих общих предков, но отличающихся многими признаками.» (Герберт Шилдт «C# учебный курс». — М.: Питер. 2003. — стр. 20).
  3. Герберт Шилдт Полный справочник по С#. : Пер. с англ. — М. : Издательский дом "Вильямс", 2004. — 752 с. : ил. — Парал. тит. англ. ISBN 5-8459-0563-X (рус.) стр. 26-27.
  4. Kovacs, James C#/.NET History Lesson (September 7, 2007). Проверено 23 марта 2011. Архивировано из первоисточника 21 августа 2011.
  5. The A-Z of Programming Languages: C# (англ.). computerworld.com.au (1 October 2008). Проверено 2 сентября 2014.
  6. Microsoft C# FAQ(недоступная ссылка — история). Microsoft. Проверено 25 марта 2008. Архивировано из первоисточника 30 апреля 2003.
  7. C# Language Specification. — 4th. — ECMA International, 2006.
  8. Visual C#.net Standard (JPEG). Microsoft (September 4, 2003). Проверено 18 июня 2009. Архивировано из первоисточника 21 августа 2011.
  9. Standard ECMA-334 C# Language Specification, 4rd edition (June 2006)
  10. ISO/IEC 23270:2003, Information technology — C# Language Specification
  11. Спецификация по Microsoft C# 2.0 содержит описание лишь новых возможностей версии 2.0. Особенности версии описаны в спецификации 1.2, приведенной выше.
  12. Для версий языка C# 3.0, 4.0 и 5.0 пока нет утвержденных ECMA или ISO/IEC спецификаций.
  13. Differences Between C++ Templates and C# Generics (C# Programming Guide)
  14. MSDN News
  15. C# Future
  16. Dot Net Anywhere

Литература[править | править вики-текст]

Ссылки[править | править вики-текст]