-{T|C#}-

-{C#}- (), је један од млађих програмских језика. Настао је 2000. године као саставни део Мајкрософтовог развојног окружења -{.NET Framework}- 1.0. На челу тима који се бавио развојем -{C#}--а био је Андерс Хејлсберг. -{C#}- подржава више парадигми (објектно оријентисану, императивну, декларативну, генеричку) као и већина модерних виших програмских језика. Језик је опште примене и намењен је изради апликација за -{.NET Framework}- платформу.

Историјат Јануара 1999. године, Андерс Хејлсберг основао је тим за израду новог програмског језика који се у почетку звао Кул (eng. "C-like Object Oriented Language"), идејно замишљен као програмски језик C, али објектно оријентисан. Мајкрософт је хтео да сачува првобитно име, али је због заштитног знака одустао.

У јулу 2000. године окружење .NET представљено је на Конференцији професионалних програмера (eng. Professional Developers Conference), језик је преименован у -{C#}-, а библиотеке и ASP.NET пренесене у -{C#}-. -{C#}- представља наследника C и C++ језика, добио је име шарп, инспирисано музичком нотацијом и значи да се написана нота изводи за пола корака више. Фајлови писани у овом језику имају екстензију .cs.

Хејлсберг је главни дизајнер -{C#}--а у Мајкрософту, а раније је радио и на дизајну Турбо Паскала, Делфија и Visual J++. У многим интервјуима и техничким документима он је навео да су управо недостаци других програмских језика (нпр. C++, Java, Delphi и Smalltalk) довели до стварања -{C#}-.

Џејмс Гослинг, који је 1994. креирао програмски језик Java, и Били Џој, суоснивач Сан-Мајкросистемса (енгл. Sun Mycrosistems) назвали су -{C#}- имитацијом Јаве. Тачније, Џејмс Гослинг је изјавио како је -{C#}- као Јава којој су искључене сигурност, продуктивност и безбедност. Клаус Крефт и Ангелика Лангер (аутори књига о C++-y) навели су у свом блогу да су "Јава и -{C#}- готово идентични програмски језици. Досадно понављање без иновација." "Тешко да ће неко тврдити да су Јава и -{C#}- језици који су променили начин на који пишемо програме", као и да је "-{C#}- много тога позајмио од Јаве и обрнуто. Сада када -{C#}- подржава боксинг и анбоксинг, имамо особине веома сличне Јави." У јулу 2000. Хејлсберг је рекао да -{C#}- није "Јавин клон" и да је по дизајну ближи C++.

Од издања -{C#}- 2.0 у новембру 2005 , језици -{C#}- и Јава почињу да се развијају у различитим правцима, а сличности је све мање. Једна од битних разлика јесте додавање генерика у оба језика са веома различитом имплементацијом. -{C#}- користи генеричке објекте прве класе (енгл. first-class) који се могу користити као и свака друга класа. Осим тога, -{C#}- је додао неколико главних карактеристика по којима би се у великој мери одвајао од других програмских језика и приближио функционалном стилу. Значајне карактеристике су: подржавање ламбда израза, методе проширења и анонимни типови. Ове карактеристике омогућавају -{C#}- програмерима да користе технике функционалног програмирања и примењују их кад год је то могуће. Линк (енгл. LINQ) екстензије и функционални увоз (eng. functional import) омогућују програмеру да пише мање кода који се често понавља и користи (нпр. код база података, раздвајање XML) фајла, претраживање података итд. стављајући акценат на програмерску логику како би се побољшала читљивост и одрживост. -{C#}- је имао и своју маскоту која се звала Енди (), по Андерсу Хејлсбергу. Пензионисана је у јануару 2004. године.

Верзије Верзија C# 1.0 Најављена је 2000. године, а премијерно је приказана 2002. године од стране компаније Мајкрософт. Био је први програмски језик прилагођен за -{.NET Framework}- окружење.

Верзија C# 2.0 У јулу 2003. Мајкрософт је представио спецификацију за -{C#}- 2.0 за почетак 2004. године. Ова верзија садржи неке нове могућности програмског језика, од којих је најзначајније да су генерици сада параметризовани типови, много више као што су то били -{C++}- шаблони. Они се имплементирају генерисањем по типу независног бајткода у времену превођења (компајлирања), а када се у времену извршења () шаблон први пут инстанцира за конкретан тип, тада се генерише бајткод зависан од типа. Та могућност даје високо-перформансне и много више типизиране генерике који не захтевају много изворног кода.

Верзија -{C#}- 3.0 Визуелни Студио је 2008. добио -{C#}- верзију 3.0 која је поседовала много нових функција. То је олакшало програмерима у прављењу својих апликација. Иновације у верзији 3.0: Ламбда изрази Стабла Анонимни типови Имплицитни типови

Верзија -{C#}- 4.0 Први пут представљена у априлу 2010. године. Иновације у верзији 4.0: Касно спајање Опциони параметри

Верзија -{C#}- 5.0 Представљена у августу 2012. године. Главне новине су: Асинхрони чланови Атрибути инфо позиваоца

Верзија -{C#}- 6.0 Представљена у јулу 2015. године. Иновације у верзији 6.0: Статички увоз Филтери изузетака Име оператора

Верзија -{C#}- 7.0 Представљена у марту 2017. године. Новине: Излазне варијабле Торке и деконструкција Подударање узорака Локалне функције

Верзија -{C#}- 7.1 Представљена у августу 2017. године. Подверзија са мањим изменама

Асинхроност у функцији Main Предетерминисани изрази са литералима Назначени називи елемената tuple

Верзија -{C#}- 7.2

Представљена у новембру 2017. године подверзија са мањим изменама:

Референтна семантика са вредносним типовима података Пренос именованих аргумената Водеће доње црте код нумеричких података Модификатор приватног заштићеног приступа

Верзија -{C#}- 7.3

Представљена у мају 2018. године подверзија са мањим изменама:

Лакши приступ фиксним пољима без Поновно додељивање локалних променљивих помоћу резервисане речи ref Коришћење иницијализатора на низовима stackalloc Коришћење фиксних исказа са било којим типом који подржава образац Коришћење додатних генеричких ограничења

Какве апликације можемо писати у -{C#}--у? Језик -{C#}- нема ограничења у погледу тога какве све апликације можемо направити. -{C#}- користи окружење и самим тим нема ограничења у вези са могућим апликацијама. Најчешћи типови прављених апликација: Виндовс апликације - То су рецимо, апликације типа Мајкрософт Офис (eng. Microsoft Office) које имају изглед Виндовса и одлично с слажу са њим. Ово је упрошћено коришћењем модула Виндовс формулара унутар .НЕТ окружења, који у ствари чини библиотека контрола (као што су дугмад, палете алатки, менија итд.) које нам користи при изради Виндовс корисничког интерфејса. Веб апликације- Веб стране које можемо видети кроз било који читач. .НЕТ окружење пружа веома моћан систем генерисања Веб садржаја и то динамички, дозвољавајући персонализацију, сигурност и још много тога. Веб сервиси - представљају нов и узбудљив начин израде разноврсних дистрибуираних апликација. Користећи Веб сервисе преко Интернета можемо размењивати било коју врсту података, користећи просту синтаксу, не водећи рачуна о томе у ком језику је написана апликација нити на ком систему је постављена.

Разлика између -{C#}- и C++ Код у језику -{C#}- је мало разумљивији од кода C++. Језик -{C#}- је сигурнији по питању доделе типа променљивама. То значи да уколико некој променљивој или неком податку доделимо одређени тип, он не може бити замењен другим типом. Постоје строга правила којих се морамо придржавати приликом конверзија типова, што у суштини значи да ћемо морати да напишемо више кода у -{C#}- него у C++-у да бисмо извршили исте задатке. Код је робуснији и једноставније је отклонити грешке, односно .NET у сваком тренутку може одредити ком типу припада тражени податак.

Због тога у -{C#}- језику, наредбе као што су „узми део меморије почевши од 4. бајта унутар податка и дужине 10 бајтова и интерпретирај га као X”, што не мора увек да буде лоша особина.

За разлику од C++, -{C#}- не подржава вишеструко наслеђивање, иако класа може имплементирати више интерфејса.

Особине језика Битно је напоменути да -{C#}- програмски језик синтаксно није сложен (има око 80 резервисаних речи), али је врло изражајан у делу где је потребно решити било какав проблем у процесу развоја софтвера. Поред могућности које се тичу саме примене програмских језика, битно је напоменути да -{C#}- подржава и следеће: Директан приступ меморији помоћу показивача у стилу C++-а Резервисане речи за издвајање несигурних операција Упозоравање скупљача смећа окружења ЦЛР(CLR) да не уништава објекте на које показују показивачи док се ти објекти не ослободе, итд. Портабилност -{C#}- по дизајну најбоље осликава ЦЛИ (енг. Common Language Infrastructure).Спецификације језика не захтевају генерисање ЦИЛ (енг. Common Intermediate Language) или било ког другог специфичног формата, већ се може компајлирати као и традиционални програмски језици C++, Фортран и други.

Методе Као код C++, за разлику од Јаве, код -{C#}- програмери морају да користе кључну реч virtual како би из подкласе променили наслеђени метод.

Методе проширења дозвољавају програмерима да користе статичке методе, с могућношћу да додају методе објекту.

Не постоје глобалне променљиве нити методе. Све променљиве и функције морају бити декларисане унутар класа.

Приступ меморији Показивачи се могу користити само у блоковима означеним са unsafe и потребна је посебна дозвола за покретање. Већини објеката се приступа путем сигурних референци који увек показују на постојеће објекте или имају јасно дефинисану нулту вредност (енг. null), немогуће је добити референцу на непостојећи објекат или на случајни блок меморије. Меморија се не ослобађа експлицитно већ то ради скупљач отпадака (енг.Garbage Collector).

Изузеци

Традиционални начин обраде грешака у језику C јесте да функција враћа код грешке у случају да се операција не изврши успешно. Проблем са оваквим приступом је да програмер може, случајно или због пропуста да игнорише грешку и у том случају, ако је грешка толико озбиљна, може се доћи у ситуацију да настави са извршавањем и долази до прекида, често с резултатима које корисник не може да разуме.

Изузетак је непредвиђен или неочекивани догађај који спречава програм да настави рад. Може да буде последица програмске грешке, коју претходно није открио преводилац или пак хардверска грешка.

Обрадом изузетака могуће је на елегантан начин одговорити на грешке. Тако извршно окружење ЦЛР, уместо да дође до прекида програма, јавља да се грешка догодила, која се у програму може обрадити, отклонити грешка или прекинути програм на коректан начин. У случају да програм не обради изузетак, извршно окружење ће прекинути програм.

Изузеци и обрада изузетака су примарни механизам за откривање грешака у језику C#. На располагању је синтакса структурне обраде изузетака ( - SEH). Основни механизам за хватање и обраду изузетака састоји се од испитног блока try , блока за хватање изузетака catch и завршног блока finally, који се пишу између обавезних витичастих заграда. Осим коришћења сва три блокова, могуће је користити и друге комбинације, које укључују само блокове try и finally, без коришћења блока catch. Такође се може користити блок try и један или више catch блокова и у том случају блок finally није обавезан.

Три поменута блока се користе на следећи начин:

испитни блок try садржи сумњиве исказе који могу да доводу до изузетка. Његово извршавање се завршава у тренутку када се изузетак догоди блок catch служи за хватање изузетака и њихову обраду. Може бити подешен тако да хвата само одређен тип изузетака. Овом блоку се предаје објекат изведен из класе Exception и неопходно му је задати тип блок finally је завршни поступак у обради изузетка и извршава се увек, било да изузетак није бачен, или да је ухваћен, па чак и у случају када због грешке програм треба да буде прекинут.

try { //испитни блок } catch (<Први_тип_изузетка>) { //искази за обраду првог типа изузетка } catch (<Други_тип_изузетка>) { //искази за обраду другог типа изузетка } catch (Exception e) { //искази за обраду општег типа изузетка } finally { //искази који се извршавају }