C Sharp

Правильное название этой страницы - C #, но ее нельзя использовать из-за технических ограничений.

C # (произносится си-шарп) - ОО язык с безопасной системой типизации для платформы . NET. Разработанная Андерсом Гейлсберг, Скоттом Вилтамутом и Питером Гольдэ под эгидой Microsoft Research (при фирме Microsoft).

Синтаксис C # близок к С + + и Java. Язык имеет строгую статическую типизацию, поддерживает полиморфизм, перегрузку операторов, указатели на функции-члены классов, атрибуты, события, свойства, исключения, комментарии в формате XML. Переняв многое от своих предшественников - языков С + +, Delphi, Модула и Smalltalk - С #, опираясь на практику их использования, исключает некоторые модели, зарекомендовавшие себя как проблематичные при разработке программных систем, например множественное наследование классов (в отличие от C + +).


1. История возникновения

C # очень близким родственником языка программирования Java. Язык Java был создан компанией Sun Microsystems, когда глобальное развитие интернета поставил задачу рассредоточенных вычислений. Взяв за основу популярную язык C + +, Java исключила из нее потенциально опасные вещи (типа указателей без контроля выхода за пределы). Для рассредоточенных вычислений была создана концепция виртуальной машины и машинно-независимого байт-кода, своего рода посредника между исходным текстом программ и аппаратными инструкциями компьютера или другого интеллектуального устройства.

Java приобрела немалую популярность, и была лицензирована также и компанией Microsoft. Но с течением времени Sun начала винить Microsoft, и при создании своего клона Java делает ее совместимой исключительно с платформой Windows, чем противоречит самой концепции машинно-независимого среды выполнения и нарушает лицензионное соглашение. Microsoft отказалась пойти навстречу требованиям Sun, и поэтому выяснение отношений получило статус судебного процесса. Суд признал позицию Sun справедливой, и обязал Microsoft отказаться от позалицензийного использования Java.

В этой ситуации в Microsoft решили, пользуясь своим весом на рынке, создать свой собственный аналог Java, языка, в котором корпорация станет полновластным хозяином. Эта вновь язык получил название C #. Она унаследовала от Java концепции виртуальной машины (среду. NET), байт-кода (MSIL) и большей безопасности исходного кода программ, плюс учла опыт использования программ на Java.

Новшеством C # стала возможность легкой взаимодействия по сравнению с языками-предшественниками, с кодом программ, написанных на других языках, что важно при создании больших проектов. Если программы на разных языках выполняются на платформе . NET,. NET берет на себя хлопоты по совместимости программ (т.е. типов данных, в конечном счету).

На сегодня C # определены флагманской языке корпорации Microsoft, потому что она наиболее полно использует новые возможности. NET. Остальные языки программирования, хотя и поддерживаются, но признаны имеющими наследственные пробелы по использованию. NET.


2. Название языка

Символ # в названии языка можно интерпретировать и как две пары плюсов + +, намекающие на новый шаг в развитии языка по сравнению с C + + (подобно шагу от C к C + +), и как музыкальный символ диез, вместе с буквой C, что составляет в английском языке название ноты до-диез. Последнее и дало название языке. Несмотря на то, что символ # (октоторп) в действительности является символом для обозначения номера на большинстве клавиатур и отличается от символа диез ♯ (Unicode U +266 F), Microsoft, как автор языка, неоднократно обращалась к своим клиентам с просьбой принять такую ​​стилизацию.


3. Особенности языка

C # разрабатывался как язык прикладного уровня для CLR и, как таковой, зависит, прежде всего, от возможностей самой CLR. Это касается, прежде всего, системы типов C #. Присутствие или отсутствие тех или иных выразительных особенностей языка диктуется тем, может ли конкретная языковая особенность быть транслируемая в соответствующие конструкции CLR. Так, с развитием CLR от версии 1.1 к 2.0 значительно обогатился и сам C #; подобного взаимодействия следует ожидать и в дальнейшем. (Однако эта закономерность будет нарушена с выходом C # 3.0, являются расширениями языка, не опирающиеся на расширение платформы. NET). CLR предоставляет C #, как и всем остальным. NET-ориентированным языкам, многие возможности, которых лишены ?классические? языки программирования . Например, сборка мусора не реализована в самом C #, а производится CLR для программ, написанных на C # точно так же, как это делается для программ на VB.NET, J # и т.д..


4. Версии

4.1. Версия 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 и при указании специальной опции компилятору.


4.2. Версия 2.0

Проект спецификации C # 2.0 впервые был выложен Microsoft в октябре 2003 года, в 2004 году выходили бета-версии (проект с кодовым названием Whidbey), C # 2.0 окончательно вышел 7 ноября 2005 вместе с Visual Studio 2005 и. NET 2.0.

Новые возможности в версии 2.0:

  • Частичные типы (разделение реализации класса более чем на один файл).
  • Обобщенные или параметризованные типы (generics, "дженерики"). В отличие от шаблонов C + +, они поддерживают некоторые дополнительные возможности и работают на уровне виртуальной машины. Вместе с тем, параметрами обобщенного типа не могут быть выражения.
  • Новая форма итератора, что позволяет создавать сопрограммы с помощью ключевого слова yield, подобно Python и Руби.
  • Анонимные методы, обеспечивающие функциональность замыкания.
  • Оператор?: Return obj1? obj2; означает (в нотации C # 1.0) return obj1! = null? obj1: obj2;.
  • Типы-значения, обнуляются (nullable), (обозначаемые знаком, например, int? I = null ;) являются теми же самыми типами-значениями, которые могут nfrj; принимать также значение null. Такие типы позволяют улучшить взаимодействие с базами данных через язык SQL.

4.3. Версия 3.0

В июне 2004 года Андерс Гейлсберг впервые рассказал на сайте Microsoft о планируемых расширения языка в C # 3.0. [1]. В сентябре 2005 года было выпущено проект спецификации C # 3.0 и бета-версия C # 3.0, устанавливается в виде дополнения к существующим Visual Studio 2005 и . NET 2.0 [2]. Официально версия C # 3.0 увидела свет 19 ноября 2007 в составе. NET Framework 3.5.

В C # 3.0 появились такие радикальные дополнения и изменения:

  • Ключевые слова select, from, where, позволяющие делать запросы с SQL, XML, коллекции и т.п. (запрос, интегрированный в язык, англ. Language Integrated Query , Или LINQ)
  • Инициализация объекта вместе с его свойствами:
 Customer с  =  new  Customer  (  )  ;  с  .  Name  =  "James"  ; 

будет иметь вид:

 Customer с  =  new  Customer  {  Name  =  "James"  }  ; 
  • Лямбда-выражения (анонимные функции):
 listOfFoo  .  Where  (  delegate  (  Foo x  )  {  return  x  .  size  >  10  ;  }  )  ; 

будет иметь вид:

 listOfFoo  .  Where  (  x  =>  x  .  size  >  10  )  ; 
  • Подразумеваемый типов локальных переменных:
 string  x  =  "Hello"  ; 

будет иметь вид:

 var  x  =  "Hello"  ; 
  • Безымянные типа:
 var  x  =  new  {  Name  =  "James"  }  ; 
  • Методы-расширения - добавления метода в существующий класс с помощью ключевого слова this при первом параметре статической функции.

C # 3.0 будет совместим с C # 2.0 с генерируемым MSIL-кодом, улучшения в языке - чисто синтаксические и реализуются на этапе компиляции. Например, многие из интегрированных запросов LINQ можно реализовать в текущих версиях используя безымянные делегаты в сочетании с предикативными методами над контейнерами, вроде List.FindAll и List.RemoveAll.


4.4. Версия 4.0

Новые возможности в версии 4.0:

  • Динамическая типизация объектов:
    • Динамический переход,
    • Динамический вызов метода.

Пример:

 dynamic  calc  =  GetCalculator  (  )  ;  int  sum  =  calc  .  Add  (  10  ,  20  )  ; 

5. Препроцессор

C # имеет "препроцессорной директивы" [3] (хотя на самом деле он не имеет препроцессора) на основе препроцессора C, это дает программисту возможность определить символы, но не макросы. Условные директивы, такие как # if, # endif, или # else также возможны. Директивы типа # region дают намек редактору для свертывания фрагментов кода.

6. Библиотеки

Спецификация C # определяет минимальный набор библиотек типов и классов, на который должен рассчитывать компилятор. На практике, C # чаще всего используется с какой-то реализацией Common Language Infrastructure (CLI), которая стандартизирована как ECMA-335 Common Language Infrastructure (CLI).

7. Стандартизация

C # стандартизированный в ECMA [4] и ISO [5].

В августе 2000 Microsoft Corporation, Hewlett-Packard и Intel Corporation выступили ко-спонсорами стандартизации спецификации языка C #, а также Common Language Infrastructure (CLI) в организации по стандартизации ECMA International. В декабре 2001 ECMA выпустила ECMA-334 Спецификация языка C #. C # стала стандартом ISO в 2003 (ISO / IEC 23270:2006 - Information technology-Programming languages-C #). К тому ECMA еще успела адаптировать эквивалентную спецификацию как другк редакцию C # в декабре 2002.

В июне 2005 ECMA приняла редакцию 3 спецификации C #, и отредактировала ECMA-334. Дополнение включали частичные классы, анонимные методы, тип null, и генерики (аналоги шаблонов C + +).

В июле 2005 ECMA подала стандарты и соответствующие технические условия на ISO / IEC JTC 1 через ускоренную процедуру (Fast-Track). Этот процесс обычно занимает 6-9 месяцев.


7.1. Критика

Хотя определение языка C # и CLI стандартизированные ISO и Ecma, что обеспечивает разумный и недискриминационный лицензионная защита (RAND) от патентных исков, Microsoft использует C # и CLI в библиотеке Base Class Library (BCL), которая является фундаментом их собственнической платформы . NET framework, и которая обеспечивает множество нестандартизированных классов (расширенный I / O, GUI Windows Forms, веб-службы и т.п.). В некоторых случаях, где патенты Microsoft относятся к стандартам, использованных в. NET framework, документированные Microsoft, и применены патенты доступны через другие RAND условия или через обет Открытой Спецификации Microsoft (Microsoft's Open Specification Promise, OSP), которые выпускают патентные права публично [6 ]. Но есть некоторые оговорки и обсуждения, что существуют дополнительные аспекты, патентованные Microsoft, которые не покрыты, которые могут содержать независимых реализаторов полного фреймворка. Microsoft также согласился не судиться с разработчиков открытого программного обеспечения о нарушении прав в неприбыльных проектах для части своего фреймворка, покрытого OSP [7]. Microsoft согласился не нарушать патентных требований продуктов Novell против платных клиентов Novell [8] за исключением перечня продуктов, явно не вспоминают C #,. NET или реализацию. NET от Novell (проект Mono) [9]. Однако Novell придерживается точки зрения, что Mono не затрагивает ни патента Microsoft. [10]. Microsoft также заключил специальное сделку не судиться с браузерного плагина Moonlight, который опирается на Mono, полученного от Novell. [11]

В замечании, опубликованном на сайте новостей Free Software Foundation в июне 2009 Ричард Столлман предупреждает, что он считает, что "Microsoft возможно планирует однажды объявить все свободные реализации C # такими, использующих программные патенты" и рекомендовал разработчикам избегать того, что он называет "безвозмездным риском", связанным с "зависимостью свободных реализаций C # " [12]. Free Software Foundation позже повторила свои предупреждения [13], утверждая, что расширение Microsoft Community Promise на спецификации ECMA C # и CLI [14] могут не вберигты от вредительства Microsoft открытым реализациям C #, поскольку много специфических для Windows библиотек, включенных в. NET и Mono , не покрытые этими обещаниями. Поэтому большинство ведущих дистрибутивов Линукс, за исключением Novell SUSE Linux, не включают Mono в установку по умолчанию (хотя его можно пидгрузиты с репозитариев).


8. Реализации

Титульным компилятором C # является Microsoft Visual C #.

Существуют другие компиляторы C #, часто они включают реализации Common Language Infrastructure и библиотеки классов. NET:

  • Проект Microsoft Rotor (который теперь называется Shared Source Common Language Infrastructure, лицензированный только для учебного и исследовательского использования) обеспечивает реализации CLR Runtime и компилятор C #, и подмножество библиотек фреймворка Common Language Infrastructure, согласно спецификации ECMA (в C # 2.0, и с поддержкой только Windows XP).
  • Проект Mono, начатый компанией Ximian и продлен ее покупателем и преемником Novell, обеспечивает открытый компилятор C #, полную открытую реализацию Common Language Infrastructure, включая необходимые библиотеки фреймворка согласно спецификации ECMA, и близкую к полной реализации собственнических библиотек классов Microsoft. NET в. NET 2.0, но не специфических библиотек. NET 3.0 и. NET 3.5 , как для Mono 2.0.
  • Проект DotGNU также предоставляет открытый компилятор C #, близкую к полной реализации Common Language Infrastructure, включая необходимые библиотеки фреймворка согласно спецификации ECMA, и подмножество некоторых оставленных собственнических билиотеку классов Microsoft. NET в. NET 2.0 (не документированные или не включены в спецификации ECMA, но включены в стандартное определение Microsoft. NET Framework).
  • DotNetAnywhere Micro Framework Common Language Runtime нацелен на встроенные системы, и поддерживает почти все спецификации C # 2.0.

9. Пример "Hello, world!"

 using  System  ;  class  ExampleClass  {  static  void  Main  (  )  {  Console  .  WriteLine  (  "Hello, world!"  )  ;  }  } 

См.. также

10. Сноски

  1. http://channel9.msdn.com/ShowPost.aspx?PostID=10276
  2. http://msdn.microsoft.com/vcsharp/future/
  3. C # Preprocessor Directives
  4. Standard ECMA-334 C # Language Specification, 4rd edition (June 2006)
  5. ISO / IEC 23270:2003, Information technology - C # Language Specification
  6. "Interoperability Principles".
  7. "Patent Pledge for Open Source Developers".
  8. "Patent Cooperation Agreement - Microsoft & Novell Interoperability Collaboration". Microsoft. November 2, 2006 . Проверено July 5, 2009 . "Microsoft, on behalf of itself and its Subsidiaries (collectively" Microsoft "), hereby covenants not to sue Novell's Customers and Novell's Subsidiaries 'Customers for infringement under Covered Patents of Microsoft on account of such a Customer's use of specific copies of a Covered Product as distributed by Novell or its Subsidiaries (collectively "Novell") for which Novell has received Revenue (directly or indirectly) for such specific copies; provided the foregoing covenant is limited to use by such Customer (i) of such specific copies that are authorized by Novell in consideration for such Revenue, and (ii) within the scope authorized by Novell in consideration for such Revenue. "
  9. "Definitions". Microsoft. November 2, 2006 . Проверено July 5, 2009 .
  10. Steinman, Justin (November 7, 2006). "Novell Answers Questions from the Community" . Проверено July 5, 2009 . "We maintain that Mono does not infringe any Microsoft patents."
  11. "Covenant to Downstream Recipients of Moonlight - Microsoft & Novell Interoperability Collaboration". Microsoft. September 28, 2007 . Проверено March 8, 2008 . "" Downstream Recipient "means an entity or individual that uses for its intended purpose a Moonlight Implementation obtained directly from Novell or through an Intermediate Recipient ... Microsoft reserves the right to update (including discontinue) the foregoing covenant ..." Moonlight Implementation "means only those specific portions of Moonlight 1.0 or Moonlight 1.1 that run only as a plug-in to a browser on a Personal Computer and are not licensed under GPLv3 or a Similar License. "
  12. Stallman, Richard (June 26, 2009). "Why free software shouldn't depend on Mono or C #". Free Software Foundation . Проверено July 2, 2009 . "The danger is that Microsoft is probably planning to force all free C # implementations underground some day using software patents .... We should systematically arrange to depend on the free C # implementations as little as possible. In other words, we should discourage people from writing programs in C #. Therefore, we should not include C # implementations in the default installation of GNU / Linux distributions, and we should distribute and recommend non-C # applications rather than comparable C # applications whenever possible. "
  13. "Microsoft's Empty Promise". Free Software Foundation. 2009-07-16 . Проверено 2009-078-03 . "Until that happens, free software developers still should not write software that depends on Mono. C # implementations can still be attacked by Microsoft's patents: the Community Promise is designed to give the company several outs if it wants them. We don't want to see developers 'hard work lost to the community if we lose the ability to use Mono, and until we eliminate software patents altogether, using another language is the best way to prevent that from happening. "
  14. "The ECMA C # and CLI Standards". 2009-07-06 . Проверено 2009-078-03 .