Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лекции все вместе / Lektsia1_Vvedenie.doc
Скачиваний:
8
Добавлен:
20.04.2015
Размер:
357.89 Кб
Скачать

Области объявления

Объявление определяет имя в области объявления, которому принадлежит объявление.

Нельзя использовать одно имя для двух или более объявлений в одной области объявления за исключением перегруженных членов.

Пространства имен могут содержать объявления типов и вложенных пространств имен.

Пространства имен и типы, имеющие родительское пространство имен, являются членами глобального пространства имен.

Пространства имен и типы, объявленные в рамках пространства имен, являются членами данного пространства имен.

Каждое объявление типа: класса, структуры, интерфейса, делегата, перечисляемого типа создает новую область объявления.

Каждое объявление метода, объявление индексатора, объявление оператора, объявление конструктора экземпляров создает новую область объявления, которая называется областью объявлений локальных переменных.

Каждый блок или блок_switch, а также инструкции for, foreach и using создают область объявлений для локальных переменных и локальных констант .

Блоки, встречающиеся в качестве тела члена функции, вложены в область объявлений локальных переменных, объявленной этими функциями для соответствующих параметров. Следовательно, наличие, к примеру, метода с одинаковыми именами локальной переменной и параметра является ошибкой.

Области видимости

Областью видимости имени является часть текста программы, в рамках которой можно ссылаться на переменную, имеющее данное имя. Области могут быть вложенные, в рамках вложенного блока невозможно объявить локальную переменную с именем, совпадающим с именем локальной переменной во внешнем блоке.

Пример программы, которая завершится с ошибкой «Невозможно объявить локальную переменную с именем "a" в этой области видимости, т.к. другое значение "a", уже используется в области видимости "родительский или текущий"

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

int a = 0;

Console.WriteLine(a);

{

int a = 6;

Console.WriteLine(a);

}

}

}

}

Пример. Объявление локальных переменных, которое не приведет к ошибке.

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

{

int a = 0;

Console.WriteLine(a);

}

{

int a = 6;

Console.WriteLine(a);

}

}

}

}

Областью члена пространства имен, объявленного объявлением члена пространства имен, является полный текст программы.

Областью члена, объявленного объявлением члена типа, является тело типа, в котором сделано объявление.

Областью параметра, объявленного в объявлении метода, является тело метода данного объявления метода.

Областью локальной переменной, объявленной в объявлении локальной переменной, является блок, в котором содержится объявление.

Областью локальной переменной, объявленной в блоке ветвления оператора switch, является блок ветвления.

Областью локальной переменной, объявленной в инициализаторе for оператора for, является инициализатор for, условие for, итератор for и содержащий оператор оператора for.

Областью локальной константы, объявленной в объявлении локальной константы, является блок, в котором содержится объявление. Ссылка на локальную константу в текстовой позиции, предшествующей декларатору константы, является ошибкой времени компилирования.

Переменные

В C# определено семь категорий переменных: статические переменные, переменные экземпляра, элементы массива, параметры по значению, параметры по ссылке, выходные параметры и локальные переменные.

Локальные переменные

Локальную переменную можно объявить в блоке, в операторе for, в операторе switch или операторе using, а также в операторе foreach или в конструкции catch в операторе try.

Объявление локальной переменной состоит из типа локальной переменной, идентификатора, определяющего имя переменной, за которым могут следовать оператор присваивание

и инициализатор локальной переменной, присваивающий переменной начальное значение.

При объявлении локальная переменная не инициализируется автоматически и поэтому не имеет значения по умолчанию (считается не имеющей начального значения).

Пример. Объявление нескольких локальных переменных.

int x = 1, y, z = x * 2;

Примеры. Операторы языка.

Оператор_итераций for

Цикл for повторно выполняет оператор или блок операторов, пока определенное выражение не примет значение false.

В цикле for может содержаться инициализатор for, условие for, итератор for, содержащий оператор оператора for (внедренный оператор)

оператор_for: for ( инициализатор_forнеобязательно ; условие_forнеобязательно ; итератор_forнеобязательно ) внедренный_оператор

Инициализатор содержит объявление локальной переменной

Условием является логическое выражение

Итератор это выражение

В следующем примере значение int i записывается в консоль, и i увеличивается на 1 за каждое прохождение цикла.

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

int i = 0;

for (i = 1; i <= 5; i++)

{

Console.WriteLine(i);

}

Console.WriteLine(i);

}

}

}

Все выражения оператора for являются необязательными. Например, следующий оператор используется для создания бесконечного цикла:

C#

for (; ; )

{

// ...

}

Оператор_итераций while

Оператор while выполняет внедренный оператор несколько раз (возможно, ни разу) в зависимости от соблюдения условия.

оператор_while: while ( логическое_выражение ) внедренный_оператор

Оператор while выполняется следующим образом.

Вычисляется логическое_выражение Если результатом логического выражения является true, управление передается внедренному оператору. Если управление достигает конечной точки внедренного оператора (возможно, в результате выполнения оператора continue), управление передается в начало оператора while.

Если значением логического выражения является false, управление передается в конечную точку оператора while.

Пример

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

int n = 1;

while (n < 6)

{

Console.WriteLine("Current value of n is {0}", n);

n++;

}

}

}

}

Оператор выбора if

Оператор if выбирает оператор языка для выполнения на основании значения логического выражения.

оператор_if: if ( логическое_выражение ) внедренный_оператор if ( логическое_выражение ) внедренный_оператор else внедренный_оператор

Пример

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

// Проверяем четность числа

// Вводим проверяемое значение

int Num;

string Str;

Console.Write("Введите число: ");

Str = Console.ReadLine();

Num = int.Parse(Str);

// если число делится на 2 без остатка то четное

// оператор % - это остаток от целочисленного деления

if (Num % 2 == 0)

{

Console.WriteLine("Число {0} - четное", Num);

}

else

{

Console.WriteLine("Число {0} - нечетное", Num);

}

Console.ReadKey();

}

}

}

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

// Найти чему будет равно выражение C = min(A,B)

// A и B целые числа, которые нужно ввести с клавиатуры

// Вывести результат и исходное выражение, подставив числа

// Введем исходные значения A и B

int A, B, C;

string Str;

Console.Write("A = ");

Str = Console.ReadLine();

A = int.Parse(Str); // Parse - статический метод структуры int

Console.Write("B = ");

Str = Console.ReadLine();

B = int.Parse(Str);

//Находим значение выражения

int min;

if (A < B)

min = A;

else

min = B;

C = min;

// Выводим результат

Console.WriteLine("min({0},{1})) = {2}", A, B, C);

Console.ReadKey();

}

}

}

Лекция 1 часть 3 Введение

Оператор выбора switch

Оператор switch выбирает для выполнения список операторов, метка которого соответствует значению switch-выражения.

оператор_switch: switch ( выражение ) блок_switch

блок_switch: { разделы_switchнеобязательно }

разделы_switch: раздел_switch разделы_switch раздел_switch

раздел_switch метки_switch список_операторов

метки_switch: метка_switch метки_switch метка_switch

метка_switch: case константное_выражение : default :

Вычисляется switch-выражение.

Если значение константы, указанной в метке case, совпадает со значением switch-выражения, управление передается списку операторов, следующему за меткой case.

Если ни одна из констант, указанных в метках case оператора switch, не совпадает со значением switch-выражения и при этом имеется метка default, управление передается списку операторов, следующему за меткой default, если метка default отсутствует, управление передается в конечную точку оператора switch.

Если после выполнения одного раздела (раздел заключен в {} скобки) switch должно следовать выполнение другого раздела switch, необходимо явным образом указывать оператор goto case или goto default.

Ошибка времени компиляции возникает, если несколько меток case в одном операторе switch задают одно и то же константное значение.

Пример

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

int caseSwitch = 5;

switch (caseSwitch)

{

case 1:

Console.WriteLine("Case 1");

break;

case 2:

Console.WriteLine("Case 2");

break;

default:

Console.WriteLine("Default case");

break;

}

}

}

}

Список операторов раздела switch обычно заканчивается оператором break, goto case или goto default.

Если за меткой case нет списка операторов, то операторы break, goto case или goto default необязательны

В примере управление передается списку операторов, следующему за меткой case 2

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main()

{

int caseSwitch = 1;

switch (caseSwitch)

{

case 1:

case 2:

Console.WriteLine("Case 2");

break;

default:

Console.WriteLine("Default case");

break;

}

}

}

}

Оператор итераций do

Оператор do выполняет внедренный оператор один или несколько раз в зависимости от соблюдения условия.

оператор_do: do внедренный_оператор while ( логическое_выражение ) ;

Управление передается внедренному оператору.

Если управление достигает конечной точки внедренного оператора, вычисляется логическое выражение.

Если результатом логического выражения является true, управление передается в начало оператора do. В противном случае управление передается в конечную точку оператора do.

Пример.

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

int x = 0;

do

{

Console.WriteLine(x);

x++;

} while (x < 5);

}

}

}

Операторы перехода

Операторы перехода осуществляют безусловную передачу управления. Операторы перехода могут передавать управление за пределы блока, но они никогда не передают управление внутрь блока.

Оператор break осуществляет выход из ближайшего объемлющего оператора switch, while, do, for или foreach.

Оператор continue начинает новую итерацию ближайшего объемлющего оператора while, do, for или foreach goto

Оператор return возвращает управление в программу, вызвавшую функцию-член, в которой используется оператор return. Оператор return с выражением может использоваться только в функции-члене, вычисляющей значение, т. е. в методе с типом возвращаемого значения, отличным от void, в методе доступа get для свойства или индексатора или в операторе, определенном пользователем.

Приведение и преобразование типов.

Преобразования бывают явными и неявными.

int a = 123; long b = a; // implicit conversion from int to long

// неявное перобразование типов, из int к long

int c = (int) b; // explicit conversion from long to int

// явное перобразование типов, из long к int

Неявные преобразования.

При вызове члена функции (метода). Для параметра имеющего тип значения вычисляется выражение аргумента и выполняется неявное преобразование в соответствующий тип параметра. Пример.

using System;

namespace ConsoleApplication5

{

class Program

{

static double f(double a, double b)

{

return a + b;

}

static void Main(string[] args)

{

int r = 2222;

double rez = f(r, 42222);

Console.WriteLine(rez);

}

}

}

Неявное преобразование при использовании оператора присваивания.

Пример. Неявное преобразование числового типа: из int к long. Компилятор неявно преобразует значение справа в тип long перед присвоением его переменной bigNum. Преобразование от меньшего к большему целому типу.

using System;

namespace ConsoleApplication5

{

class Program

{

static void Main(string[] args)

{

int num = 2147483647;

long bigNum = num;

}

}

}

Неявные преобразования числовых типов.

Существуют следующие неявные преобразования числовых типов:

  • из sbyte к short, int, long, float, double или decimal;

  • из byte к short, ushort, int, uint, long, ulong, float, double или decimal;

  • из short к int, long, float, double или decimal;

  • из ushort к int, uint, long, ulong, float, double или decimal;

  • из int к long, float, double или decimal;

  • из uint к long, ulong, float, double или decimal;

  • из long к float, double или decimal;

  • из ulong к float, double или decimal;

  • из char к ushort, int, uint, long, ulong, float, double или decimal;

  • из float к double.

Преобразования из типов int, uint, long или ulong к float, а также из long или ulong к double могут привести к потере точности, но не величины. Другие неявные преобразования числовых типов никогда не приводят к потере данных.

Неявных преобразований к типу char не существует, поэтому значения любых других целых типов не могут быть преобразованы к типу char.

Соседние файлы в папке лекции все вместе