Операторите в С# са много близки до операторите в C++ и Java и имат същите действие и приоритет. Те биват:
-
Аритметични: +, -, *, /, %, ++, --
-
Логически: &&, ||, !, ^, true, false
-
Побитови операции: &, |, ^, ~, <<, >>
-
За слепване на символни низове: +
-
За сравнение: ==, !=, <, >, <=, >=
-
За присвояване: =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>=
-
За работа с типове: as, is, sizeof, typeof
-
Други: ., [], (), ?:, new, checked, unchecked, unsafe
В C# операторите могат да се предефинират. В темата "Обектно-ориентирано програмиране в .NET" ще видим как точно става това.
Изрази (expressions)
Програмен код, който се изчислява до някаква стойност, се нарича израз (expression). Изразите в C# имат синтаксиса на C++ и Java. Например:
a = b = c = 20; // израз със стойност 20
(а+5)*(32-a)%b // израз с числова стойност
"ала" + "бала" // символен израз (string)
Math.Cos(Math.PI/x) // израз с реална стойност
typeof(obj) // израз от тип System.Type
(int) arr[idx1][idx2] // израз от тип int
new Student() // израз от тип Student
(currentValue <= MAX_VALUE) // булев израз
| Програмни конструкции (statements)
Програмните конструкции (statements) имат синтаксиса на C++ и Java. Те биват няколко вида:
Елементарни програмни конструкции
Елементарните програмни конструкции са най-простите елементи на програмата. Например:
// присвояване (<променлива> = <израз>)
sum = (a+b)/2;
// извикване на метод
PrintReport(report);
// създаване на обект
student = new Student("Светлин Наков", 3, 42688);
| Съставни конструкции
Съставните програмни конструкции се състоят от няколко други конструкции, оградени в блок. Например:
{
Report report = GenerateReport(period);
report.Print();
}
| Програмни конструкции за управление
Конструкциите за управление, както в повечето езици за програмиране, биват условни конструкции, конструкции за цикъл, за преход и т. н. В C# синтаксисът на тези конструкции е много близък до синтаксиса на C++ и Java.
Условни конструкции (conditional statements)
Условните конструкции в С# са if, if-else и switch. Техният синтаксис е еднакъв със синтаксиса им в C, C++ и Java.
if и if-else конструкциите за разлика от С и С++ могат да приемат единствено булево условие. Не са позволени целочислени стойности, които да играят ролята на true, ако са различни от 0 и false – иначе. Ето няколко примера за условна конструкция:
if (orderItem.Ammount > ammountInStock)
{
MessageBox.Show("Not in stock!", "error");
}
if (Valid(order))
{
ProcessOrder(order);
}
else
{
MessageBox.Show("Invalid order!", "error");
}
|
Ново в switch конструкцията за разлика от C и C++ е, че позволява изразът, по който се осъществява условието, да бъде от тип string или enum. Например:
switch (characterCase)
{
case CharacterCasing.Lower:
text = text.ToLower();
break;
case CharacterCasing.Upper:
text = text.ToUpper();
break;
default:
MessageBox.Show("Invalid case!", "error");
break;
}
|
Конструкцията switch се различава от реализацията си в С++. В С# не се разрешава "пропадане" (fall-through). Пропадането в switch конструкциите може да доведе до грешки. Независимо от удобствата, които предлага тази възможност, дизайнерите на езика С# са преценили, че рискът за грешка поради пропускане на break е по-голям, затова всеки case етикет трябва задължително да завършва с break.
Конструкции за повторение и цикъл
Конструкциите за повторение (iteration statements) са for-цикъл, while-цикъл, цикъл do-while и цикъл foreach – за обработка на колекции. Техният синтаксис е еднакъв със синтаксиса им в C, C++ и Java. Изключение прави foreach цикълът, който няма еквивалент в C и C++. Ето няколко примера:
Пример за for-цикъл:
// Отпечатваме числата от 1 до 100 и техните квадрати
for (int i=1; i<=100; i++)
{
int i2 = i*i;
Console.WriteLine(i + " * " + i + " = " + i2);
}
|
Пример за while-цикъл:
// Изчисляваме result = a^b
result = 1;
while (b > 0)
{
result = result * a;
b--;
}
|
Пример за цикъл do-while:
Операторът foreach е приложим за масиви, колекции и други типове, които поддържат интерфейса IEnumerable или имaт метод за извличане на итератор (enumerator).
Пример за цикъл foreach:
string[] names = GetNames();
// Отпечатваме всички елементи на масива names
foreach (string name in names)
{
Console.WriteLine(name);
}
| Конструкции за преход
Конструкциите за преход в C# са: break, continue – които се използват в цикли, goto – за безусловен преход и return – за връщане от метод. Те работят по същия начин, като в C, C++ и Java.
Пример за използване на конструкцията break:
// Търсим позицията на даден елемент target в масива a[]
int position = -1;
for (int i=0; i
{
if (a[i] == target)
{
position = i;
break;
}
}
return position;
| Конструкции за управление на изключенията
Конструкциите за управление на изключенията в С# са: throw – за предизвикване на изключение, try-catch – за прихващане на изключение, try-finally – за сигурно изпълнение на завършваща секция и try-catch-finally – за прихващане на изключение със завършваща секция.
Пример за предизвикване и прихващане на изключение:
// ...
public static void ThrowException()
{
// ...
throw new System.Exception();
}
// ...
public static void Main()
{
try
{
ThrowException();
}
catch(System.Exception e)
{
// ...
}
finally
{
// ...
}
}
|
Методът ThrowException() предизвиква изключение от тип Exception, което може да бъде прихванато, ако функцията, която го предизвиква, се намира в try-catch блок. В такъв случай може да се извършат действия в catch блока, в зависимост от информацията, която носи това изключение.
Конструкциите try-finally и try-catch-finally се използват най-вече за освобождаване на ресурси, които се използват в тялото им. Независимо дали възникне изключение при работата с даден ресурс, той трябва да бъде освободен накрая – това обикновено се прави във finally блок, който се изпълнява независимо дали се минава през catch блока. Блокът finally се изпълнява дори и да има return в catch или try блок.
В темата "Управление на изключенията в .NET" ще разгледаме подробно работата с изключения, техните особености и препоръките за правилна работа с тях.
Специални конструкции
Специалните конструкции в С# са: lock – за синхронизирано изпълнение, checked, unchecked – за контрол на аритметичните препълвания, unsafe – за директен достъп до паметта чрез указатели, fixed – за фиксиране на местоположението в паметта при работа с неуправляван код.
Сподели с приятели: |