C# (C Sharp, произнася се Си Шарп) е обектно ориентиран език за програмиране, разработен от Microsoft като част от софтуерната платформа .NET. Стремежът още при създаването на C# езика е бил да се създаде прост, модерен, обектно ориентиран език с общо предназначение. Основа за C# са C++, Java и донякъде езици като Delphi, VB.NET и C. Той е проектиран да балансира мощност (C++) с възможност за бързо разработване (Visual Basic и Java). Те представляват съвкупност от дефиниции на класове, които съдържат в себе си методи, а в методите е разположена програмната логика – инструкциите, които компютърът изпълнява. Програмите на C# представляват един или няколко файла с разширение .cs, в които се съдържат дефиниции на класове и други типове. Тези файлове се компилират от компилатора на C# до изпълним код и в резултат се получават асемблита – файлове със същото име, но с различно разширение (.exe или .dll).
Ето примерна версия на програмата „Hello, world!“ (в системна конзола), написана на C#: using System;
class Hello { static void Main()
Console.WriteLine("Hello, World!");
Езикът C# и платформата .NET Първата версия на C# е разработена от Microsoft в периода 1999 – 2002 г. и е пусната официално в употреба през 2002 г. като част от .NET платформата, която има за цел да улесни съществено разработката на софтуер за Windows среда чрез качествено нов подход към програмирането, базиран на концепциите за „виртуална машина“ и „управляван код“. По това време езикът и платформата Java, изградени върху същите концепции, се радват на огромен успех във всички сфери на разработката на софтуер и разработката на C# и .NET е естественият отговор на Microsoft срещу успехите на Java технологията. Едно от най-големите предимства на .NET Framework е вграденото автоматично управление на паметта. То предпазва програмистите от сложната задача сами да заделят памет за обектите и да търсят подходящия момент за нейното освобождаване. Това сериозно повишава производителността на програмистите и увеличава качеството на програмите, писани на C#.
Mono Тъй като оригиналната версия на езика C# и платформата .NET са само за Windows, се появява проектът Mono. Mono е проектиран, за да позволи на разработчиците да създават лесно софтуер за различни платформи. Той е имплементация със свободен код на платформата .NET. Базиран е на ECMA стандартите за C# и виртуалната машина на .NET – Common Language Runtime. Mono сваля бариерите за създаване на качествен софтуер за GNU/Linux с езика C#. Mono може да работи върху голям брой платформи като Android, GNU/Linux дистрибуциите, BSD, OS X, Windows, Solaris и дори върху някои конзоли – PlayStation 3, Wii, и Xbox 360.
Препратки в C# Езикът C# използва следните основни (има и допълнителни) ключови думи за построяване на своите програмни конструкции: + Препраткиabstractasbasebool breakbytecasecatch charcheckedclassconst continuedecimaldefaultdelegate dodoubleelseenum eventexplicitexternfalse finallyfixedfloatfor foreachgotoifimplicit inin (generic modifier)intinterface internalislocklong namespacenewnullobject operatoroutout (generic modifier)override paramsprivateprotectedpublic readonlyrefreturnsbyte sealedshortsizeofstackalloc staticstringstructswitch thisthrowtruetry typeofuintulongunchecked unsafeushortusingvirtual voidvolatilewhile
Управление на паметта За управлението на паметта в .NET Framework се грижи специален компонент от CLR, наречен „система за почистване на паметта“ (garbage collector). Основната задача на тази система е да следи кога заделената памет за променливи и обекти вече не се използва, да я освобождава и да я прави достъпна за последващи заделяния на нови обекти.
Дизайнерски цели C# е създаден като прост, модерен, с общо предназначение и обектно ориентиран език за програмиране. Езикът е предназначен за използване в развиващите се софтуерни компоненти, той е подходящ и за разполагане в разпределена среда. На езика C# и върху .NET платформата може да бъде разработван разнообразен софтуер като офис приложения, уеб приложения, уеб сайтове, настолни приложения, мултимедийни интернет приложения, приложения за мобилни телефони, различни видове игри и много други.
Оператори +КатегорияОператори аритметични -, +, *, /, %, ++, -- логически &&, ||, &, |, ^, ! побитови &, |, ^, ~, <<, >> за сравнение ==, !=, >, <, >=, <= за присвояване=, ^=, <<=, >>= съединяване на символни низове + за работа с типове (type), as, is, typeof, sizeof други ., new, (), [], {}, ?:, ??
Версии В своето развитие C# е преминал през следните версии:
+от MicrosoftВерсияДата.NET FrameworkVisual StudioC# 1.0януари 2002.NET Framework 1.0Visual Studio .NET 2002C# 1.2април 2003.NET Framework 1.1Visual Studio .NET 2003C# 2.0септември 2005.NET Framework 2.0Visual Studio 2005C# 3.0август 2007.NET Framework 3.5Visual Studio 2008 Visual Studio 2010C# 4.0април 2010.NET Framework 4Visual Studio 2010C# 5.0август 2012.NET Framework 4.5Visual Studio 2012 Visual Studio 2013C# 6.0юли 2015.NET Framework 4.6Visual Studio 2015C# 7.0март 2017.NET Framework 4.6.2Visual Studio 2017C# 7.1август 2017.NET Framework 4.6.2Visual Studio 2017
Коментиране на кода В C# се използва двойна наклонена черта (//), за да се покаже, че останалата част от линията е коментар. Това е наследено от C++. public class Foo { // коментар public static void Bar(int firstParam) {} // също коментар } По-дългите коментари могат да бъдат обозначени с „начало“ (/*) и „край“ (*/). Това е наследено от стандартните C. public class Foo { /* По-дълъг коментар */ public static void Bar(int firstParam) {} }
Условни конструкции if-else Условните конструкции if и if-else предоставят условен тип контрол, чрез който програмата може да изпълнява различни функции в зависимост от някакво условие, което се проверява по време на изпълнение на конструкцията. public static void IfElse { if (булев израз)
тяло тип (1) на условната конструкция;
else if (нов булев израз)
тяло тип (2) на условната конструкция;
else
тяло тип (3) на else-конструкция;
Форматът включва: if клауза, булев израз и тяло на условната конструкция, if-else конструкцията се състои от: запазена дума if, булев израз, тяло на условната конструкция, запазена дума else, тяло на else конструкция. Тялото на else конструкцията може да се състои от един или няколко оператора, заградени в къдрави скоби, също както тялото на условната конструкция.
switch-case Конструкцията switch-case избира измежду части от програмен код на базата на стойност на зададения селектор, който представлява променлива или израз (най-често целочислен). Форматът на конструкцията за избор на вариант е следният: public static void SwitchCase { switch (селектор)
case стойност на селектора (1): конструкция; break; case стойност на селектора (2): конструкция; break; case стойност на селектора (3): конструкция; break; case стойност на селектора (4): конструкция; break; // ... default: конструкция; break;
Операторът switch сравнява резултата от селектора с всяка една стойност от изброените в тялото на switch конструкцията в case етикетите. Ако се открие съвпадение с някой case етикет, се изпълнява съответната конструкция. Ако не се открие съвпадение, се изпълнява default конструкцията.
Цикли в C# Циклите в C# са while, do-while, for и foreach. C# предоставя нов вид цикъл, наречен foreach, който е близък до for each на Visual Basic. Foreach позволява да се преминава през всеки елемент и поддържа IEnumerable интерфейс.
while public static void while { // Докато условието е вярно цикъла ще се изпълнява. while (условие)
do-while public static void do-while { // Разликата на do-while с while е, че do-while ще се изпълни задължително поне един път и след това ще проверява условието. do
while (условие) }
for public static void for { //Инициализация, следвана от проверка на условието, изпълнение на цикъла. for (i=0; i<10; i++)
foreach public static void foreach { //Изпълнение на цикъла за всеки елемент от масив или списък. foreach (елемент in колекция)
Масиви Масивите представляват съвкупности от променливи с дадени стойности. Тези променливи могат да бъдат примитивен или референтен тип. Елементите на масивите в C# са номерирани с числата 0, 1, 2, ... N-1. Тези номера на елементи се наричат индекси, а броят елементи в даден масив N се нарича дължина на масива. Масивите също така могат да бъдат от различни размерности едномерни, двумерни .. n-мерни.
Деклариране и инициализиране на масиви: public static void Array { //Деклариране на масив с променливи от тип int и размер 6 елемента int[] oneDimArray = new int; myArray = 301; // задаване на елемента под индекс 0, стойност равна на 301
//Деклариране на масив, размер 6 елемента, заедна със стойности на съответните индекси: 0, 1, 2, 3, 4, 5 int[] oneDimArrayNew = { 301, 302, 303, 299, 310, 323 };
//Деклариране на двумерен масив, размер 3 х 4 елемента. //вариант 1 чрез задаване на размерите int[,] intMatrix = new int[3, 4];
//вариант 2 чрез директно задаване на стойностите int[,] intMatrixNew =
{1, 2, 3, 4}, // стойности на ред 0 {5, 6, 7, 8}, // стойности на ред 1 {5, 3, 4, 8}, // стойности на ред 2
Методи Чрез употребата на методи в C# при реализирането на даден код се постига разделяне на множество подпрограми (subroutines), сглобени в една обща програма. Целта на това разделяне на методи е програмният код да бъде по-ясно четим, което от своя страна води до по-лесно писане на програмата, намиране на неточности и преправяне на вече написания код.
Най-общо принципът за дефиниране на методи в C# e: всеки метод да върши конкретна задача, името му да бъде показателно за работата, която върши, като, ако поради някаква причина методът не успее да изпълни работата, за която е предназначен, трябва да хвърли грешка (exception). Обикновено размерът на кода на един метод не трябва да е повече от един екран.
Друга много важна причина, заради която е добре да се използват методи, е, че по този начин се избягва повторението на код. Това е пряко свързано с концепцията за преизползване на кода.
Правила за именуване на метод: Името на методите трябва да започва с главна буква Трябва да се прилага правилото „PascalCase“: (всяка нова дума, която се долепя като част от името на метода, трябва да започва с главна буква) Имената на методите е препоръчително да бъдат съставени от глагол или от глагол и съществително име
Пример за извикване на метод: class ExampleProgram { static void Main()
// ... string[] names = { "Ivan", "Petar", "Hristo" }; for (int i = 0; i < names.Length; i++)
PrintName(names[i]); // метод, който принтира съответния зададен string, без да връща стойност
// ... int result = SolveEquation(2, 4); // метод, който връща стойност от тип int Console.WriteLine(result); // ...
private static int SolveEquation(int num1, int num2)
try
int result = num1 * num2 – (num1 + num2); return result;
catch (ArgumentOutOfRangeException)
throw new ArgumentOutOfRangeException();
catch (OverflowException)
throw new OverflowException();
private static void PrintName(string currentName)
Console.WriteLine(currentName);
Варианти на методи (method overloading)
Когато в даден клас има деклариран метод, чието име съвпада с името на друг метод, но сигнатурите на двата метода се различават по списъка от параметри (броят на елементите в него или подредбата им), имаме различни варианти на този метод (method overloading).
class ExampleMethodOverload { static void Main()
string stringToPrint = "hello"; int intToPrint = 5; float floatToPrint = 2.33f;
Print(stringToPrint); Print(intToPrint); Print(floatToPrint);
static void Print(string str)
Console.WriteLine(str);
static void Print(int number)
Console.WriteLine(number);
static void Print(float number)
Console.WriteLine(number);
Прихващане и обработка на изключения Изключения в .NET