Статията описва синтаксиса на програмния език C#. Описаните характеристики са съвместими с .NET Framework и Mono.
Основи Идентификатор В C# имената на променливи, методи, класове и други обекти се наричат идентификатори. Те се избират от разработчика. Идентификаторите могат да съдържат букви, цифри ([0 – 9]) и символа долна черта (_), но не могат да започват с цифра или символ, освен ако не е ключова дума. Идентификаторите са чувствителни към големи и малки букви (FOO е различно от foo). Те не могат да се използват като запазени ключови думи, освен ако не са оградени с @. Това включва думи като int, class, public и т.н.
Идентификаторите могат да се именуват, използвайки следните конвенции: PascalCase за имената на класове, методи, и публични свойства (FirstName, LastName), и camelCase – за имената на локални променливи и параметри на методи (firstName, lastName).
Ключови думи Ключовите думи са предефинирани запазени идентификатори, които имат специално значение за компилатора. Езикът C# има да вида ключови думи – контекстуални и запазени. Запазените ключови думи, като false или byte, могат да бъдат използвани само като ключови думи. Контекстуалните ключови думи, като where или from, могат да бъдат третирани като такива само в определени ситуации.
Ключови думи abstract as base bool breakbytecasecatchcharcheckedclassconstcontinuedecimaldefaultdelegatedodoubleelseenumeventexplicitexternfalsefinallyfixedfloatforforeachgotoifimplicitinintinterfaceinternalislocklongnamespacenewnullobjectoperatoroutoverrideparamsprivateprotectedpublicreadonlyrefreturnsbytesealedshortsizeofstackallocstaticstringstructswitchthisthrowtruetrytypeofuintulonguncheckedunsafeushortusingvirtualvoidvolatilewhile Контекстуални ключови думиaddandaliasascendingargsasyncawaitbydescendingdynamicequalsfilefromgetglobalgroupinitintojoinletmanagednameofnintnotnotnullnuintonororderbypartialrecordremoverequiredscopedselectsetunmanagedvaluevarwhenwherewithyield
Контекстуалните ключови думи имат специфично значение, само в ограничен програмен контекст, и могат да бъдат използвани като идентификатори извън този контекст. Някои контекстуални думи, като partial или where, имат специално значение в два или повече контекста.
Употребата на @-ключови думи за идентификатори не се препоръчва, освен за специални цели. Също знакът @ може да предхожда всеки идентификатор, но това се счита за лоша практика.
Литерали Литералите са константни стойности, зададени в кода на компютърната програма. Те представляват данни в техния основен вид, които могат да се присвояват на променливи или да се използват в изрази. Пример за това се явява числото 123 (целочислен литерал), текстът изучаваме C# (текстов литерал) или буквата „ы“ (символен литерал). Всеки литерал има определен тип (или се отнася към определен тип) и се обработва в съответствие с правилата за работа със стойностите от дадения тип. Символният литерал се затваря в единични кавички, а текстовият – в двойни.
Булеви Булевите литерали са или . Когато присвояваме стойност на променлива от тип , можем да използваме единствено някоя от тези две стойности или израз от булев тип (който се изчислява до true или false).
Целочислени Целочисленият литерал се реализира като стойност от най-малкия тип, започвайки от тип , достатъчен за съхранението на стойността на литерала. Целите числа могат да бъдат представяни в десетичен, шестнадесетичен и двоичен формат. При тях се използват още следните означения: 0x или 0X за шестнайсетични литерали (например 0xA8F1); 'l' и 'L' като окончания означават данни от тип long (например 357L); 'u' и 'U' като окончания означават данни от тип uint или ulong (например 112u).
Тип Стойностиint12, 1234, -16uint12U, 12ulong12L, 12lulong12UL, 12ulhexadecimal0xF5, 0x[0..9, A..F, a..f]+
Реални Реалните числови литерали (например числото 12.3) се реализират във вид на стойности от типа , и . При тях се използват още следните означения: 'f' и 'F' като окончания означават данни от тип float; 'd' и 'D' като окончания означават данни от тип double; 'm' и 'M' като окончания означават данни от тип decimal; 'e' означава експонента, например "e-5" означава цялата част да се умножи по 10-5.
Тип Стойностиfloat23.5F, 23.5f; 1.72E3F, 1.72E3f, 1.72e3F, 1.72e3fdouble23.5, 23.5D, 23.5d; 1.72E3, 1.72E3D, ...decimal79228162514264337593543950335m, -0.0000000000000000000000000001m, ...exponential notation6.02e+23, 1.72E3f, 1.72E3m
Символни Символните литерали представляват единични символи, оградени в единични кавички (например 'F' или 'я') и се реализират като стойности от тип . Стойността на символните литерали може да бъде: символ (например 'A'); код на символ (например '\u0065'); символни последователности.
Тип Стойностиchar'a', 'Z', '\u0231', '\x30', '\n'
Текстови Текстовите литерали (низови) се затварят в двойни кавички (например "Езикът C#" или "А") и се реализират като обекти на класа от пространството от имена (използваме идентификатора string за израза ).
Тип Стойностиstring
Цитираните текстови литерали се използват най-често при задаване на имена на пътища във файловата система.
Символни последователности Символните последователности са литерали, които представляват последователност от специални символи, които задават символ, който по някаква причина не може да се изпише директно в програмния код. Всички последователности започват с обратно наклонен черта \, която наричаме екраниращ символ (escaping character).
Тип Стойностисимвол, зададен с Unicode номера си\uсимвол, зададен с ASCII номера си\xНулев символ\0Отместване (табулация)\tВръщане назад\bВръщане в изходно положение\rСледваща страница\fОбратна наклонена черта\\Единична кавичка\'Двойна кавичка\"Нов ред\n
Нулев тип Нулевите типове (nullable types) представляват нулева стойност, която означава, че променливата не сочи към никакъв обект. Те са инстанции на структурния декоратор () на върху примитивните типове.
Нулевите типове могат да представляват неопределена или липсваща стойност за променлива, която обикновено не може да бъде . Тези типове са полезни при работа с бази данни или други структури, които имат нулева стойност по подразбиране.
int? nullableInt = null; double? nullableDouble = 3.14; bool? nullableBool = true;
За проверка дали нулевият тип съдържа стойност, може да се използва метода или директна проверка за .
Разделители за цифри Това е функционалност на C# 7.0. Разделителите за цифри разделят цифрите в числови стойности със символа за долна черта _ за по-голяма четимост и разбиране на програмния код.
int bigNumber = 1_000_000; // 1 милион int debitCardNumber = 1234_5678_9012_3456; // Номер на банкова карта int socialSecurityNumber = 999_99_9999; // Единен граждански номер double bigDouble = 1_234.567_89; // Число с плаваща запетая decimal largeDecimal = 1_000_000.1234_5678m; // Десетично число int hexNumber = 0xAB_CD_EF; // Шестнадесетично число int binaryNumber = 0b1010_0011_1100_0101; // Двоично число
Променливи Променливите са именувани пространства (идентификатори) в паметта, които могат да съхраняват стойности от различни типове данни. Всяка променлива има свой тип, който влияе на обема на паметта, заделяна за променливата, а също така и на това какви стойности могат да бъдат записвани в променливата и какви операции могат да се изпълняват с променливата.
Променливите имат обхват (scope), който определя къде в кода могат да бъдат достъпвани. Обхватът на променливите се ограничава от блоковете, където са декларирани.
Деклариране Преди да бъде използвана променливата, тя трябва да бъде декларирана. Декларирането може да стане практически на всяко място в програмния код, но обезателно преди променливата да бъде използвана. При деклариране на променлива може веднага да ѝ бъде присвоена стойност. int myInt; // Деклариране на неинициализирана променлива с име 'myInt' и тип 'int'
Присвояване Присвояването на стойност на променлива представлява задаване на стойност, която да бъде записана в нея. Тази операция се извършва чрез оператора за присвояване =. От лявата страна на оператора се изписва име на променлива, а от дясната страна – новата ѝ стойност. int myInt; // Деклариране на неинициализирана променлива myInt = 35; // Инициализиране на променливата
Инициализиране Инициализация означава задаване на начална стойност в момента на тяхното деклариране. Всеки тип данни в C# има стойност по подразбиране (инициализация по подразбиране), която се използва, когато за дадена променлива не бъде изрично зададена стойност. int myInt = 35; // Едновременно деклариране и инициализиране на променливата
Няколко променливи от един и същи тип могат да бъдат декларирани и инициализирани в една декларация. int a, b; // Деклариране на няколко променливи от един и същи тип int a = 2, b = 3; // Деклариране и инициализирани на няколко променливи от един и същи тип
Възможно е и динамично инициализиране на променливата, когато променливата се инициализира въз основа на израз, в който влизат други променливи, ако към момента на изчисление променливите имат стойности.
var декларация Това е функционалност на C# 3.0. Декларирането на променливи с позволява спецификатора на декларираната променлива да бъде заменен с ключовата дума var, ако действителният ѝ тип може да бъде статично определен от инициализатора. Това намалява повторенията, особено за типове с множество типови параметри.
// Деклариране на променливи с ключовата дума 'var' var myChars = new char[] {'A', 'Ö'}; // или char[] myChars = new char[] {'A', 'Ö'}; var myNums = new List<int>(); // или List<int> myNums = new List<int>();
Константи Константите са имплицитно статични стойности, които не могат да бъде променяни след декларирането им.
const Константите трябва да бъдат декларирани в контекста като поле или локална променлива с префикса на ключовата дума , като стойност ѝ трябва да се даде при декларирането. След това тя е заключена и не може да бъде променяна.
// Деклариране на константа от тип double const double PI = 3.14;
Следният пример показва всички употреби на const: // Публичен клас Foo public class Foo { // Деклариране на частна константа от тип double private const double X = 3;
// Публичен метод Foo public Foo() { // Деклариране на глобална константа от тип int const int y = 2;
readonly Ключовата дума прави подобно нещо за полетата. Подобно на полетата, маркирани с const, те не могат да се променят веднъж щом им се зададе начална стойност. Разликата е, че може по избор да им се зададе начална стойност в конструктора. Това важи само за полета, които са само readonly и могат да бъдат, както членове на една инстанция или статични членове на класа.
Блокове код Операторите с къдрави скоби { ... } се използват за обозначаване на блок код и нова област на видимост. В този програмен блок може да се намират членовете на класа или тялото на метод.
В тялото на метод скобите може да се използват за създаване на нови обхвати: static void Main() { // Променлива декларирана в главния метод: int a; // Команди { // Начало на вътрешен обхват Променливи, декларирани във вътрешен обхват: int b; a = 1; } // Край на вътрешен обхват // Команди a = 2; b = 3; // Инициализацията ще бъде неуспешна, тъй като променливата 'b' е декларирана във вътрешния обхват }
Името на променлива, декларирана във вътрешен блок, не може да съвпада с името на променлива, декларирана във външен блок.
Структура на програмата C# приложенията се състоят от класове и техните членове. Класовете и другите типове съществуват в именни пространства, но също могат да бъдат вложени в други класове.
Главен метод Методът Main е входната точка за изпълнение на всяка конзолна програма. Това е мястото, където започва изпълнението на програмата. Може да съществува само един главен метод в клас и той е статичен. Методът обикновено връща и като списък от параметри има единствен параметър от тип масив от низове.
Главният метод има специфичен синтаксис и може да приема аргументи от командния ред.