Время жизни и область видимости перменных.
Объявление переменных.
Все переменные в языке C# должны быть инициализированы. Попытка использовать неинициализированную переменную в правой части оператора «присваивание» приведет к ошибке на стадии компиляции. Инициализация возможна при объявлении, либо возможна отложенная инициалиация, с помощью оператора «Присваивание». Более того, в C# можно инициализировать переменные с помощью оператора New и конструктора умолчания
int i = new int();
Причем для встроенных типов не определен конструктор с параметром
int i = new int(72); // Ошибка на стадии компиляции.
В языке C# глобальных перменных уровня модуля нет. Это сделано с целью устранения ошибок и повышения надежности программ. Классы могут обмениваться информацией вызывая соответствующие методы друг друга. А также с помощью обработчика событий на который они реагируют. В языке C# запрещено определять локальные перменные имена которых совпадают с именами формальных аргументов. Этот запрет распространяется не только уровне процедурного блока, но и на все внутренние блоки. Переменная, объявленная во внешнем блоке рассматривается как глобальная по отношению к внутренним блокам. Во внутренних блоках запрещено использование имен, совпадающих с именем во внешнем блоке.
Большинство операций наследовано из языка C++.
1) Отсутвует операция «Запятая».
2) Арифметические операции не определены для младших типов. Перед выполнением операции неявно идет преобразование к старшему типу.
byte b1 = 1, b2 = 2, b3;
b3 = b1 + b2; // Ошибка на стадии компиляциию
b3 = (byte)(b2+b3);
Условный оператор.
Выражение в операторе IF должно быть булевского типа. Оно принимает значения либо TRUE либо FALSE. Арифметический тип не имеет не имеет ни явных, ни неявных преобразований к булевскому типу.
Оператор SWITCH.
В языке C# каждая CASE ветвь должна заканчиваться оператором перехода. Кроме целых типов в переключателях могут использоваться строки.
В C# появился новый вид цикла.
foreach(тип_идентификатор in контейнер)
оператор;
Элементы в контейнере должны быть упорядочены. На каждом шаге цикла идентификатор задающий текущий элемент контейнера получает значение очередного элемента в соответсвии с установленным порядком. Цикл работает только на чтение элементов, но не на запись.
Процедурные функции.
В C# вводится новый синтаксис объявления формального аргумента.
[ref | out | params] тип_аргумента имя_аргумента.
Квадратные скобки — необязательность.
В C# можно задать произвольное число аргументов. Для этого последний аргумент списка придворяется ключевым словом params и деклариурется как массив произвольного типа. Содержательно все аргументы разделяются на три группы:
1) Входные. Только передают информацию методу.
2) Выходные. Выходные (с ключевым словом out) передают результат метода). Внутри метода им обязательно должно быть пресвоено значение.
3) Обновляемые. (ref) Выполняют обе функции.
Входные параметры передаются по значению. Выходные или обновляемые передаются по ссылке.
Если формальный аргумент объявлен с ключевым словом ref или out, то фактически аргумент должен сопровождаться таким же ключевым словом при вызове. По умолчанию все структурные типы передаются по значению, соответсвенно ссылочные - по ссылке. Явно указывать тип аргумента необходимо, например, при передаче структурных типов по ссылке.
Массивы в .NET
Массивы в C++.NET
Одномерный массив:
using namespace cli;
array <int>^ ar1=gcnew array<int>(10) {1,2};
1) Массивы в .NET реализуются на основе класса array.
2) Массив — это параметризированный тип, который реализуется с помощью шаблонов.
3) Массив — это ссылочный тип. Данные хранятся в динамически-управляемой HEAP, память выделяется с помощью оператора gcnew.
4) Размерность массива указывается в качестве параметра конструктора при инициализации ссылки. Размерность является свойством или признаком конкретного экземпляра, а не типа. Размерность может быть опущена (пустые скобки), тогда она будет вычисленна по количеству инициализаторов.
5) Поскольку массивы реализуются как класс, то это самоопределенный тип и он содержит информацию о своем размере.
for(int i=0; i< ar1->Length;i++)
arr[i] = i*2;
Многомерные массивы
using namespace cli;
array <int,2>^ ar2=gcnew array<int, 2>(10, 15) {1,2};
for(int i=0; i< ar1->GetLength(0);i++)
for(int j=0;j< ar2->GetLength(1);j++)
arr[i,j] = i*j; //Вводится новый синтаксис доступа к элементу многомерных массивов. Делается с целью — показать, что массив является истинно-прямоугольным, то есть все строки могут содержать одинаковую длину.






