C Sharp

**C#** (вымаўляецца *сі шарп*) — шматпарадыгмавая мова праграмавання, якая ахоплівае строга тыпізаванае, імператыўнае, дэкларатыўнае, функцыйнае, працэдурнае, абагульненае, аб’ектна-арыентаванае і кампанентна-арыентаванае праграмаванне. Распрацавана фірмай Microsoft у межах ініцыятывы .NET, пазней зацверджана як стандарт Ecma (ECMA-334) і ISO (ISO/IEC 23270:2006). C# — адна з моў праграмавання, спраектаваных для Common Language Infrastructure. C# пабудавана на сінтаксісе і семантыцы C++, дазваляе праграмістам на мове C атрымаць перавагі платформы .NET і CLR (common language runtime).

C# нацэлена быць простай, сучаснай, аб’ектна-арыентаванай мовай агульнага прызначэння.

Каманду распрацоўшчыкаў узначальвае Андэрс Хейлсберг. Станам на лістапад 2022 года, самая апошняя стабільная версія мовы — C# 11.0, выпушчаная ў 2022 годзе ў складзе .NET 7.0.

## Праектныя мэты 
Стандарт ECMA пералічвае наступныя мэты распрацоўкі C#:
Гэта падобна на назву мовы 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# прайшла праз некалькі версій:

## Сінтаксіс 
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# не дазваляе аб’яўляць глабальныя пераменныя і функцыі. Усе метады і члены павінны быць аб’яўлены ў класах. Статычныя члены публічных класаў могуць замяняць глабальныя пераменныя і функцыі.
* Лакальныя пераменныя не могуць зацяняць пераменныя вонкавага блока, у адрозненне ад C і C++.
* Прасторы імёнаў у C# прадстаўляюць такі ж самы ўзровень ізаляцыі коду, як і пакункі ў Java () ці прасторы імёнаў у C++ (); правілы і магчымасці вельмі падобныя на пакунак Java.
* C# падтрымлівае строгі булеўскі тып (). Выразы, якія прымаюць умовы, такія як *while* і *if*, патрабуюць такі тып выразу, які рэалізуе аператар *true*, такі як булеўскі тып. У той час як C++ таксама мае булеўскі тып, апошні можа быць свабодна канверсаваны ў і з цэлалікавага тыпу, і такія выразы, як *if(a)* патрабуюць толькі, каб *a* можна было ператварыць у булеўскі тып, дазваляючы *a* быць цэлалікавым ці ўказальнікам. C# забараняе такі падыход, калі «цэлы лік азначае true ці false», засноўваючыся на меркаванні, што патрабаванне да праграміста выкарыстоўваць выразы, якія вяртаюць дакладна булеўскі тып, засцерагае ад пэўнага тыпу праграмісцкіх памылак, распаўсюджаных у C ці C++, такіх як `1=if (a = b)` (ужыванне прысвойвання `=` замест роўнасці `==`).
* У C#, указальнікі на адрасы ў памяці могуць быць ужытыя толькі ўнутры блока, асобна пазначанага як *небяспечны* (*unsafe*), а праграмы з небяспечным кодам патрабуюць адпаведных дазволаў на запуск. Доступ да аб’ектаў у большасці выпадкаў адбываецца праз бяспечныя спасылкі на аб’ект, якія заўжды ўказваюць на «жывы» аб’ект, ці маюць строга вызначанае значэнне *null*; немагчыма атрымаць спасылку на «мёртвы» аб’ект (апрацаваны працэдурай зборкі смецця), ці на выпадковы блок памяці. Небяспечны ўказальнік можа ўказваць на экзэмпляр тыпу значэнне, масіў, радок, ці блок памяці, размешчаны ў стэку. Код без пазнакі «небяспечны» можа захоўваць і змяняць указальнікі праз тып `System.IntPtr`, але не можа разымяноўваць іх.
* Кіраваная памяць не можа быць яўна вызвалена; замест гэтага, працуе аўтаматычная зборка смецця. Зборка смецця вырашае праблему ўцечкі памяці (), вызваляючы праграміста ад адказнасці за вызваленне памяці, якая больш не патрэбна.
* У дадатак да канструкцыі `try...catch` для апрацоўкі выключэнняў C# мае канструкцыю `try...finally`, якая гарантуе выкананне коду ў блоку `finally` незалежна ад таго, здарылася выключэнне ці не.
* Множнае наследаванне не падтрымліваецца, але клас можа рэалізоўваць любую колькасць інтэрфейсаў. Гэта было праектнае рашэнне галоўнага архітэктара мовы, каб пазбегнуць ускладнення і спрасціць архітэктурныя патрабаванні ва ўсёй CLI. Пры рэалізацыі некалькіх інтэрфейсаў, якія ўтрымліваюць метад з аднолькавай сігнатурай, C# дазваляе праграмісту рэалізаваць кожны метад у залежнасці ад таго, праз які інтэрфейс гэты метад будзе выкліканы, ці, падобна Java, дазваляе праграмісту рэалізаваць метад адзін раз, і мець адзіны выклік пры звароце праз любы з інтэрфейсаў класа.
* C#, у адрозненне ад Java, падтрымлівае перагрузку аператараў. Толькі тыя аператары, што найчасцей перагружаюць у C++, могуць быць перагружаны ў C#.
* C# больш тыпабяспечная, чым C++. Прадвызначаны толькі тыя пераўтварэнні тыпаў, якія лічацца бяспечнымі, напрыклад, пашырэнне цэлых лікаў. Патрабаванне дзейнічае ў часе кампіляцыі, цягам JIT-кампіляцыі, і ў некаторых выпадках у часе выканання. Няма няяўных пераўтварэнняў ні паміж булеўскім і цэлалікавым тыпамі, ні паміж членамі пералічэння і цэлымі лікамі (за выключэннем літарала 0, які можа быць няяўна пераўтвораны ў любы тып пералічэння). Кожнае вызначанае карыстальнікам пераўтварэнне павінна быць яўна пазначана як яўнае ці няяўнае, у адрозненне ад прадвызначана няяўных капіравальнага канструктара і аператара пераўтварэння ў C++.
* C# мае яўную падтрымку каварыянтрасці і контр-варыянтнасці ў абагульненых тыпах, у адрозненне ад C++, якая ў пэўнай ступені падтрымлівае контр-варыянтнасць проста праз семантыку вяртаных віртуальнымі метадамі тыпаў.
* Члены пералічэння змяшчаюцца ў іх уласны абсяг бачнасці ().
* C# прадстаўляе ўласцівасці як сінтаксічны цукар для распаўсюджанага выпадку, калі пара метадаў, аксесар () і мутатар () інкапсулююць аперацыі над адным атрыбутам класа. Не трэба пісаць залішнія сігнатуры метадаў для рэалізацыі гетара і сэтара, а доступ да ўласцівасці можна атрымаць праз сінтаксіс атрыбута, замест даўжэйшых выклікаў метадаў.
* У C# няма правераных выключэнняў (), у адрозненне ад Java. Гэта было свядомае рашэнне, заснаванае на меркаваннях маштабавальнасці і версіявальнасці.
* Хоць C# у першую чаргу імператыўная мова, у версіі 2.0 прапанавана абмежаваная падтрымка функцыянальнага праграмавання праз першакласныя функцыі і замкненні ў форме ананімных дэлегатаў. C# 3.0 пашырыла падтрымку функцыянальнага праграмавання увядзеннем легкаважнага сінтаксісу для лямбда-выразаў, метадаў пашырэння (афорданс для модуляў), і сінтаксісу разумення спісаў () у форме мовы «разумення запытаў».

## Агульная сістэма тыпаў 
C# мае *ўніфікаваную сістэму тыпаў*. Гэта сістэма мае назву «агульная сістэма тыпаў» (, скарочана CTS).

Уніфікаваная сістэма тыпаў падразумявае, што ўсе тыпы, уключаючы прымітывы, такія як цэлыя лікі, з’яўляюцца падкласамі класа `System.Object`. Напрыклад, кожны тып наследуе метад `ToString()`.

### Катэгорыі тыпаў даных 
CTS раздзяляе тыпы даных на дзве катэгорыі:

Прыклад:

```csharp
int foo1 = 42; // Value type.
object bar = foo1; // foo is boxed to bar.
int foo2 = (int)bar; // Unboxed back to value type.
```

### Джэнерыкі 
Джэнерыкі былі дададзены ў мову C# у версіі 2.0. Джэнерыкі выкарыстоўваюць параметры тыпу, што дазваляе праектаваць класы альбо метады, якія не ўказваюць выкарыстаны тып да таго часу, пакуль не будзе створаны асобнік класа ці метаду. Галоўнай перавагай з’яўляецца тое, што можна ўжываць параметры тыпу для джэнерыкаў, каб ствараць класы і метады, якія можна выкарыстаць без выдаткаў на прывядзенне тыпаў у час выканання ці на аперацыі boxing, як паказана тут:

```csharp
// Declare the generic class.

public class GenericList
{
    void Add(T input) { }
}

class TestGenericList
{
    private class ExampleClass { }
    static void Main()
    {
        // Declare a list of type int.
        GenericList list1 = new GenericList();

        // Declare a list of type string.
        GenericList list2 = new GenericList();

        // Declare a list of type ExampleClass.
        GenericList list3 = new GenericList();
    }
}
```

У параўнанні з шаблонамі C++, джэнерыкі C# могуць даць палепшаную бяспеку, але ў той жа час у чымсьці абмежаваныя магчымасці. Напрыклад, нельга выклікаць арыфметычныя аператары над тыпамі джэнерыкаў у C#.

## Прэпрацэсар 
C# прадстаўляе «дырэктывы прэпрацэсара» (хаця не мае «сапраўднага» прэпрацэсара), заснаваныя на прэпрацэсары мовы C, якія дазваляюць праграмісту вызначаць сімвалы, але не дазваляюць макрасы. Таксама прадстаўляюцца умоўныя аператары, такія як `#if`, `#endif`, і `#else`. Дырэктывы кшталту `#region` даюць падказку тэкставаму рэдактару па згортванні коду.

```csharp
public class Foo
{
    #region Constructors
    public Foo() {}
    public Foo(int firstParam) {}
    #endregion

    #region Procedures
    public void IntBar(int firstParam) {}
    public void StrBar(string firstParam) {}
    public void BoolBar(bool firstParam) {}
    #endregion
}
```

## Каментарыі 
C# выкарыстоўвае двайны слэш (`//`), каб паказаць, што рэшта радка — гэта каментарый. Такі стыль каментарыяў атрыманы ў спадчыну ад C++.

```csharp
public class Foo
{
    // a comment
    public static void Bar(int firstParam) {}  // also a comment
}
```

Шматрадковы каментарый можна пачаць слэшам і зорачкай (`/*`) і закончыць зорачкай і слэшам (`*/`). Гэта спадчына стандартнай мовы C.

```csharp
public class Foo
{
    /* A Multi-Line
       comment  */
    public static void Bar(int firstParam) {}
}
```

## Сістэма XML-дакументацыі 
Сістэма дакументацыі ў C# падобная на Javadoc у Java, але заснавана на XML. У цяперашні час кампілятар C# падтрымлівае два метады дакументавання.

Аднарадковыя дакументацыйныя каментарыі, такія як шырока распаўсюджаныя ў згенераваным Visual Studio кодзе, уяўляюць сабой радок, што пачынаецца з `///`.

```csharp
public class Foo
{
    /// A summary of the method.
    /// A description of the parameter.
    /// Remarks about the method.
    public static void Bar(int firstParam) {}
}
```

Шматрадковыя дакументацыйныя каментарыі, хоць былі вызначаны ў спецыфікацыях мовы ў версіі 1.0, не падтрымліваліся да выпуску .NET 1.1. Гэтыя каментарыі пачынаюцца з слэша і дзвюх зорачак (`/**`) і заканчваюцца дзвюма зорачкамі і слэшам (`*/`).

```csharp
public class Foo
{
    /** A summary of the method.
     *  A description of the parameter.
     *  Remarks about the method. */
    public static void Bar(int firstParam) {}
}
```

Заўвага: ёсць некаторыя строгія крытэрыі датычна прабелаў і XML-дакументацыі пры выкарыстанні тэхнікі слэш-зорачка-зорачка (`/**`).

Гэты блок коду:

```csharp
/**
 * 
 * A summary of the method.*/
```

утварае XML-каментарый, які адрозніваецца ад выніку гэтага блока: але ёсць пэўныя асцярогі і спрэчкі наконт існавання дадатковых, нявызначаных аспектаў, запатэнтаваных Майкрасофт, якія могуць абмежаваць незалежныя рэалізацыі поўнага фрэймоворку.

Майкрасофт пагадзілася не падаваць у суд на распрацоўшчыкаў праграм з адкрытым зыходным кодам за парушэнне патэнтаў у некамерцыйных праектах у частцы фрэймворку, што пакрыта OSP. Таксама, Майкрасофт пагадзілася не прымяняць патэнты, якія тычацца прадуктаў кампаніі Novell, супраць плацежаздольных кліентаў кампаніі, за выключэннем спісу прадуктаў, якія не згадваюць яўна C#, .NET ці рэалізацыю .NET ад фірмы Novell (Mono Project). Аднак, Novell сцвярджае, што Mono не парушае ніводнага патэнта Майкрасофт. Таксама, Майкрасофт зрабіла канкрэтнае пагадненне не ўжываць патэнтныя правы, звязаныя з браўзерным плагінам Moonlight, які залежыць ад Mono, пры ўмове, што ён атрыманы ад Novell.

## Рэалізацыі 
Узорным кампілятарам мовы C# выступае Microsoft Visual C#, зыходны код якога адкрыты.

Існуюць таксама іншыя кампілятары C#, часта поруч з рэалізацыяй агульнай моўнай інфраструктуры і бібліятэк класаў .NET:
* Праект Mono прадстаўляе кампілятар C# з адкрытым зыходным кодам, поўную рэалізацыю агульнай моўнай інфраструктуры ўключна з неабходнымі бібліятэкамі фрэймворка, якія апісаны ў спецыфікацыях ECMA, і амаль поўную рэалізацыю прыватнаўласніцкіх бібліятэк класаў .NET ад Майкрасофт. У версіі 4.0 Mono падтрымлівае ўсё, што ёсць у .NET 4.5, за выключэннем WPF і WwF, абмежавана падтрымлівае WCF і асінхронны стэк ASP.NET 4.5.
* Праект DotGNU (зараз спынены) таксама прадстаўляе кампілятар C# з адкрытым зыходным кодам, амаль поўную рэалізацыю Common Language Infrastructure ўключна з неабходнымі бібліятэкамі фрэймворка, як апісана ў спецыфікацыях ECMA, і падмноства астатніх прыватнаўласніцкіх бібліятэк класаў .NET ад Майкрасофт да версіі .NET 2.0 (тых, што не дакументаваны ці не ўвайшлі ў спецыфікацыі ECMA, але ўключаны ў стандартную пастаўку фрэймворка .NET ад Майкрасофт).
* Праект Rotor ад Майкрасофт (у цяперашні час называецца Shared Source Common Language Infrastructure) (ліцэнзаваны толькі для адукацыйных і даследчых мэт) забяспечвае рэалізацыю асяроддзя выканання CLR і кампілятара C# з агульнай кодавай базай, і падмноства неабходных для агульнай моўнай інфраструктуры бібліятэк фрэймворка, як апісана ў ECMA (да версіі C# 2.0, падтрымліваецца толькі ў Windows XP).

## Гл. таксама 
* Oxygene
* Sing#
* Microsoft Visual Studio
* MonoDevelop
* Morfik
* SharpDevelop
* Turbo C Sharp

## Літаратура 
* 
* 

## Спасылкі 
* C# Language Specification (from MSDN)
* C# Language Specification (hyperlinked, Visual C# Developer Center) 
* C# Programming Guide (MSDN)
* Download C# Express
* [ISO C# Language Specification](http://standards.iso.org/ittf/PubliclyAvailableStandards/c042926_ISO_IEC_23270_2006(E).zip).
* Microsoft Visual C# .NET

Катэгорыя:Сямейства моў праграмавання C Sharp
Катэгорыя:Мовы праграмавання сямейства C
Катэгорыя:Мовы праграмавання платформы .NET
Катэгорыя:Мовы вэб-праграмавання
Катэгорыя:Мовы праграмавання высокага ўзроўню
Катэгорыя:Мовы праграмавання Microsoft