C# (вымаўляецца сі шарп) — шматпарадыгмавая мова праграмавання, якая ахоплівае строга тыпізаванае, імператыўнае, дэкларатыўнае, функцыйнае, працэдурнае, абагульненае, аб’ектна-арыентаванае і кампанентна-арыентаванае праграмаванне. Распрацавана фірмай Microsoft у межах ініцыятывы .NET, пазней зацверджана як стандарт Ecma (ECMA-334) і ISO (ISO/IEC 23270:2006). C# — адна з моў праграмавання, спраектаваных для Common Language Infrastructure. C# пабудавана на сінтаксісе і семантыцы C++, дазваляе праграмістам на мове C атрымаць перавагі платформы .NET і CLR (common language runtime).C++ -> C#: What You Need to Know to Move from C++ to C#
C# нацэлена быць простай, сучаснай, аб’ектна-арыентаванай мовай агульнага прызначэння.
Каманду распрацоўшчыкаў узначальвае Андэрс Хейлсберг. Станам на лістапад 2022 года, самая апошняя стабільная версія мовы — C# 11.0, выпушчаная ў 2022 годзе ў складзе .NET 7.0.«Welcome to C# 11». November 11, 2022.«Announcing .NET 7 — the Fastest .NET Yet». November 11, 2022.
Праектныя мэты Стандарт ECMA пералічвае наступныя мэты распрацоўкі C#: Мова праграмавання C# прызначана быць простай, сучаснай, аб’ектна-арыентаванай мовай агульнага прызначэння. Мова, а значыць і яе рэалізацыі, павінны забяспечваць падтрымку такіх прынцыпаў распрацоўкі праграм, як строгая праверка тыпаў, праверка межаў масіваў, выяўленне спробаў выкарыстаць неініцыялізаваныя зменныя, і аўтаматычную зборку смецця. Надзейнасць праграм, іх даўгавечнасць, і прадукцыйнасць працы праграміста важныя. Мова прызначана для выкарыстання ў распрацоўцы праграмных кампанентаў, прыдатных да разгортвання ў размеркаваных асяроддзях. Пераноснасць зыходнага коду вельмі важная, як і мабільнасць праграмістаў, асабліва тых праграмістаў, якія ўжо знаёмы з C і C++. Падтрымка інтэрнацыяналізацыі вельмі важная. C# прызначана быць зручнай для напісання праграм як для гасцявых, так і ўбудаваных сістэм, пачынаючы ад вельмі буйных, што выкарыстоўваюць складаныя аперацыйныя сістэмы, да вельмі дробных, якія маюць толькі вызначаныя функцыі. Хоць праграмы на C# прызначаны быць эканамічнымі ў дачыненні да патрабаванняў памяці і вылічальнай магутнасці, сама мова не прызначана для прамога спаборніцтва ў прадукцыйнасці і памеры з Сі ці асэмблерам.
Назва
Назва «C sharp» натхнёна музычнай натацыяй, дзе дыез () паказвае, што пазначаная нота павінна гучаць на паўтона вышэй. Гэта падобна на назву мовы C++, дзе «++» азначае, што пераменная мусіць быць павялічана на 1. Знак «дыез» таксама нагадвае лігатуру з чатырох сімвалаў «+» (у рашотцы два на два), паглыбляючы меркаванне, што мова з’яўляецца прырашчэннем C++.
З-за тэхнічных абмежаванняў на адлюстраванне (стандартныя шрыфты, браўзеры і да т.п.) і дзякуючы таму факту, што знака «дыез» (♯) няма на стандартнай клавіятуры, быў выбраны сімвал рашоткі (#) для прадстаўлення знака «дыез» у назве мовы праграмавання. Гэта пагадненне адлюстравана ў спецыфікацыях мовы C# ECMA-334. Аднак, калі гэта дарэчна (напрыклад, у рэкламе ці ў мастацтве), Майкрасофт ужывае музычны знак.
Суфікс быў ужыты для некалькіх моў платформы .NET, якія з’яўляюцца варыянтамі існых моў, уключна з J# (мова платформы .NET, створаная Майкрасофт як вытворная ад Java 1.1), A# (з Ады), і функцыйнай мовай F#. Першапачатковая рэалізацыя Eiffel for .NET называлася Eiffel#, цяпер назва не ўжываецца, паколькі мова Eiffel падтрымліваецца поўнасцю. Суфікс таксама быў ужыты ў назвах праграмных бібліятэк, такіх як Gtk# (абгортка для GTK+ і іншых бібліятэк GNOME), Cocoa#.
Гісторыя У час распрацоўкі платформы .NET Framework, былі напісаны бібліятэкі класаў з выкарыстаннем сістэмы кампіляцыі кіраванага коду пад назвай Simple Managed C (SMC). У студзені 1999, Андэрс Хейлсберг сабраў каманду, каб стварыць новую мову, якая на той час звалася Cool, што расшыфроўваецца як «C-like Object Oriented Language». У Майкрасофт разглядалі магчымасць захаваць назву «Cool» у якасці канчатковай назвы мовы, але вырашылі не рабіць гэтага з меркаванняў гандлёвых марак. Да таго часу, як праект .NET быў публічна абвешчаны ў ліпені 2000 на Professional Developers Conference, мова была перайменавана ў C#, а бібліятэкі класаў і рантайм ASP.NET былі партаваны на C#.
Галоўным канструктарам і вядучым архітэктарам C# у Майкрасофт з’яўляецца Андэрс Хейлсберг. Раней ён удзельнічаў у распрацоўцы Turbo Pascal, Embarcadero Delphi (да гэтага CodeGear Delphi, Inprise Delphi і Borland Delphi), і Visual J++. У інтэрв’ю і тэхнічных дакументах ён сцвярджае, што недахопы большасці шырокаўжываных моў праграмавання (г.зн. C++, Java, Delphi і Smalltalk) прывялі да стварэння Common Language Runtime (CLR), што, у сваю чаргу, вызначыла дызайн мовы C#.
Джэймс Гослінг, стваральнік мовы праграмавання Java, і Біл Джой, сузаснавальнік Sun Microsystems, пачынальніка Java, назвалі C# «імітацыяй» Java; Гослінг далей сказаў, што «[C#] свайго роду Java з выдаленай надзейнасцю, прадукцыйнасцю і бяспекай.» Клаус Крэфт і Анжэліка Лангер (аўтары кнігі C++ streams) заявілі ў сваім блогу, што «Java і C# амаль ідэнтычныя мовы праграмавання. Нуднае паўтарэнне, якому бракуе інавацый», «Наўрад ці нехта будзе сцвярджаць, што Java ці C# — рэвалюцыйныя мовы праграмавання, якія змянілі спосаб, якім мы пішам праграмы» і «C# пазычыў шмат у Java — і наадварот. Цяпер, калі C# падтрымлівае абгорткі () і разгорткі (), мы будзем мець вельмі падобную функцыю ў Java». У ліпені 2000 года Андэрс Хейлсберг сказаў, што C# «не клон Java» і «нашмат бліжэй да C++» у сваім дызайне.
Ад выдання C# 2.0 у лістападзе 2005, мовы C# і Java развіваліся па больш разбежных траекторыях, становячыся менш падобнымі. Адно з першых галоўных разыходжанняў з’явілася з даданнем джэнерыкаў () у абедзве мовы, з абсалютна рознымі рэалізацыямі. C# выкарыстоўвае матэрыялізацыю (), каб прадставіць «першакласныя» аб’екты джэнерыкаў, якія можна ўжываць як любы іншы клас, з генерацыяй кода падчас загрузкі класа. Насупраць, джэнерыкі ў Java — па-сутнасці асаблівасць сінтаксісу мовы, яны не ўплываюць на генераваны байт-код, таму што кампілятар выконвае сціранне тыпу () на інфармацыі аб тыпе джэнерыка пасля таго, як упэўніўся ў яе правільнасці.
Далей C# дадала некалькі асноўных магчымасцяў, каб дастасаваць праграмаванне ў функцыянальным стылі, што прывяло да выпуску пашырэння LINQ у C# 3.0, з падтрымкаю лямбда-выразаў (), метадаў пашырэння (), і ананімных тыпаў. Гэтыя магчымасці дазваляюць праграмістам на C# выкарыстоўваць тэхнікі функцыянальнага праграмавання, такія як замкненні (), калі іх прымяненне мэтазгодна. Пашырэнні LINQ і функцыянальны імпарт дапамагаюць распрацоўшчыкам паменшыць колькасць «шаблоннага» коду, які ўключаны ў такія агульныя задачы, як запыт да базы звестак, разбор xml-файла, ці пошук у структуры дадзеных, пераносячы акцэнт на дзейную логіку праграмы, што дапамагае палепшыць чытэльнасць і суправаджальнасць.
C# мела талісман, званы Эндзі (у гонар Андэрса Хейлсберга). Не ўжываецца з 29 студзеня 2004 г.
C# была першапачаткова пададзена на разгляд падкамітэту ISO JTC 1/SC 22 як ISO/IEC 23270:2003, які цяпер зняты. Пазней ухвалена ў рамках ISO/IEC 23270:2006.
Версіі Цягам свайго развіцця, мова C# прайшла праз некалькі версій: Версія CLR Спецыфікацыі мовы Дата .NET Framework Visual Studio ECMA ISO/IEC Microsoft C# 1.0 1.0Снежань 2002Красавік 2003 Студзень 2002 Студзень 2002.NET Framework 1.0Visual Studio .NET 2002 C# 1.2 1.1 Кастрычнік 2003 Красавік 2003.NET Framework 1.1Visual Studio .NET 2003 C# 2.0 2.0 Чэрвень 2006 Верасень 2006 Верасень 2005 Лістапад 2005.NET Framework 2.0Visual Studio 2005 C# 3.0 2.02.0 SP1 — — Жнівень 2007 Лістапад 2007.NET Framework 2.0 (За выняткам пашырэнняў LINQ/Query) .NET Framework 3.0 (За выняткам пашырэнняў LINQ/Query) .NET Framework 3.5Visual Studio 2008Visual Studio 2010 C# 4.0 4.0 — — Красавік 2010 Красавік 2010.NET Framework 4Visual Studio 2010 C# 5.0 4.5 — — Чэрвень 2013 Жнівень 2012.NET Framework 4.5Visual Studio 2012
Дакумент спецыфікацый Microsoft C# 2.0 утрымлівае толькі новыя магчымасці 2.0. Старэйшыя магчымасці гл. у спецыфікацыі 1.2 вышэй. Няма спецыфкацый ECMA ці ISO/IEC для C# 3.0, 4.0 ці 5.0. Не было версіі CLR 3.0. У дакументацыі CLR апісваецца як 4.5, але Environment.Version паказвае 4.0.
+ Падсумаванне версій C# 2.0 C# 3.0 C# 4.0 C# 5.0 БудучыняДададзеныфункцыі Джэнерыкі Частковыя тыпы Ананімныя метады Ітэратары Абнульвальныя тыпы Прыватныя сетары (уласцівасці) Канверсія груп метадаў (дэлегаты) Каварыянтнасць і контр-варыянтнасць Статычныя класы Няяўна тыпізаваныя лакальныя зменныя Ініцыялізатары аб’ектаў і калекцый Аўтаматычна рэалізаваныя ўласцівасці Ананімныя тыпы Метады пашырэнняў Выразы-запыты Лямбда-выразы Дрэвы выразаў Частковыя метады Дынамічнае звязванне Іменаваныя і апцыянальныя аргументы Каварыянтнасць і контр-варыянтнасць джэнерыкаў Убудаваныя тыпы interop («NoPIA») Асінхронныя метады Атрыбуты інфармацыі абанентаў C# 5.0 Кампілятар-як-паслуга (Roslyn) C# 6.0 Імпарт членаў тыпу ў прастору імён Сціслы сінтаксіс для першасных канструктараў Толькі-чытаныя ўласцівасці Выразы ўласцівасцей (лямбды ўласцівасцей) Выразы метадаў Масівы параметраў для інтэрфейсаў IEnumerable Сціслая праверка на нуль Множныя вяртаныя велічыні Інтэрфейс тыпу канструктара
Сінтаксіс
C# мае наступны сінтаксіс:
Для пазначэння канца выраза ўжываецца кропка з коскай. Фігурныя дужкі выкарыстоўваюцца для групавання выразаў. Выразы звычайна групуюцца ў метады (функцыі), метады ў класы, класы ў прасторы імён. Пераменныя прызначаюцца з ужываннем знака роўнасці, а параўноўваюцца з ужываннем двух паслядоўных знакаў роўнасці. Квадратныя дужкі выкарыстоўваюцца з масівамі, як для аб’яўлення, так і для таго, каб атрымаць значэнне ў пазіцыі з дадзеным індэксам.
Адрозныя магчымасці
Паводле дызайну, C# — гэта мова праграмавання, якая найбольш проста адлюстроўвае ляжачую ў аснове агульную моўную інфраструктуру (). Большасць яе ўбудаваных тыпаў адпавядае тыпам-значэнням, рэалізаваным фрэймворкам CLI. Аднак, спецыфікацыі мовы не гавораць пра патрабаванні да генерацыі коду кампілятарам, г.зн., не гаворыцца, што кампілятар C# мусіць мець на мэце Common Language Runtime, ці генераваць агульную прамежкавую мову (), ці генерыраваць іншы спецыфічны фармат. Тэарэтычна, кампілятар C# можа генераваць машынны код, як традыцыйныя кампілятары C++ ці Фартрана.
Вось некаторыя заўважныя магчымасці C#, якія адрозніваюць яе ад C і C++ (і Java, дзе пазначана): C# падтрымлівае няяўнае аб’яўленне строга тыпізаваных пераменных з ключавым словам var, і няяўна тыпізаваных масіваў з ключавым словам new[], за якім ідзе ініцыялізатар калекцыі. Метапраграмаванне праз атрыбуты C# з’яўляецца часткаю мовы. Многія з гэтых атрыбутаў дублююць функцыянальнасць платформазалежных дырэктыў прэпрацэсараў GCC і VisualC++. Як у C++, і ў адрозненне ад Java, праграмісты на C# мусяць выкарыстоўваць ключавое слова virtual, каб дазволіць метадам быць перавызначанымі ў падкласах. Метады пашырэння ў C# дазваляюць праграмістам ужываць статычныя метады так, быццам гэта метады з табліцы метадаў класа, дазваляючы праграмістам дадаваць да аб’екта метады, якія, паводле іх адчування, мусяць быць у аб’екта і яго вытворных. Тып dynamic дазваляе звязванне метаду падчас выканання, дазваляючы выклік метаду як у JavaScript і складанне аб’екта ў час выканання. C# мае падтрымку строга тыпізаваных указальнікаў на функцыю праз ключавое слова delegate. Падобна наяўным у фрэймворку Qt псеўда-C++ сігнал і слот, C# мае семантычныя сродкі, якія спецыфічна атачаюць падзеі ў стылі публікацыя-падпіска, хаця C# выкарыстоўвае дэлегаты для гэтага. C# прапануе падобныя на Java сінхранізаваныя выклікі метадаў праз атрыбут [MethodImpl(MethodImplOptions.Synchronized)], і мае падтрымку ўзаемна-выключных замыканняў з дапамогай ключавога слова lock. Мова C# не дазваляе аб’яўляць глабальныя пераменныя і функцыі. Усе метады і члены павінны быць аб’яўлены ў класах. Статычныя члены публічных класаў могуць замяняць глабальныя пераменныя і функцыі.