4756

Проектирование и разработка типов на языке C# в соответствии со стандартами принятыми в спецификации CTS (Система общих типов)

Лекция

Информатика, кибернетика и программирование

Проектирование и разработка типов на языке C# в соответствии со стандартами принятыми в спецификации CTS (Система общих типов). Лекция. Введение. Общие сведения о системе общих типов (CTS). Типы значений и ссылочные типы. Встроенные типы. Определени...

Русский

2012-11-25

343 KB

8 чел.

Проектирование и разработка типов на языке C# в соответствии со стандартами принятыми в спецификации CTS (Система общих типов).

Лекция. Введение. Общие сведения о системе общих типов (CTS). Типы значений и ссылочные типы. Встроенные типы. Определение типа: атрибуты; модификаторы; имя; базовый тип данного типа; интерфейсы, реализованные этим типом; члены типа. Модификаторы для членов типа. Ключевые слова, которые влияют на определение типа или члена типа.

Введение.

Литература

1. Спецификация языка C#. Доступна на веб-узле MSDN Online в Центре разработчиков Visual C# http://www.microsoft.com/en-us/download/details.aspx?id=7029 или в Visual Studio в каталоге установки \VC#\Specifications\...

2. Библиотека MSDN http://msdn.microsoft.com/ru-ru/library/default.aspx

3. Джеффри Рихтер  CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C# Питер, Русская Редакция 2007

Средства разработки и языки программирования

C# – это простой, современный, типобезопасный, объектно-ориентированный язык программирования. Язык C# стандартизирован ECMA на соответствие стандарту ECMA-334, а также ISO/IEC на соответствие стандарту ISO/IEC 23270.

Необходимо установить:

распространяемое бесплатно средство разработки:
Microsoft Visual C# 2008 Express Edition (Microsoft Visual C# 2008, экспресс-выпуск); Экспресс-выпуск доступен для скачивания по ссылке: http://www.microsoft.com/visualstudio/ru-ru/products/2008-editions/express

и распространяемый бесплатно пакет: .NET Framework,  который устанавливается автоматически при установке Microsoft Visual C# 2008 Express Edition.

Cреда разработки Microsoft Visual Studio  включает: средства управления проектами, редактор исходного текста, компиляторы, компоновщики, документацию, отладчики, конструкторы пользовательского интерфейса …

Документация по Использованию интегрированной среды разработки Visual C# доступна по ссылке:  http://msdn.microsoft.com/ru-ru/library/h8w79z10(v=vs.90),

Построение и отладка Visual C# по ссылке http://msdn.microsoft.com/ru-ru/library/ms173083(v=vs.90)

.NET Framework — платформа разработки. Основными компонентами .NET Framework являются:

  •  общеязыковая среда исполнения (common language runtime, CLR) предоставляет объектно-ориентированную модель программирования;
  •  библиотека классов (Framework Class Library, FCL) предоставляет объектно-ориентированный интерфейс, используемый всеми моделями приложений;

Пример кода на языке C#.

Примеры по Созданию консольных приложений (Visual C#) доступны по ссылке http://msdn.microsoft.com/ru-ru/library/452fz12a(v=vs.90) 

Пример. Создание консольного приложения Visual C# Console Application.

//директива using с перечислением пространств имен библиотеки классов платформы .NET Framework //определяет префикс System

using System;

// объявление собственного пространства имен

namespace ConsoleApplication2

{

   //Класс Program объявлен с единственным членом - статическим методом Main

   class Program

   {

       //Метод Main - точка входа в программу

       static void Main(string[] args)

       {

           string text;

           Console.Write("Введите текст\n");

           text = Console.ReadLine();

      //статический метод WriteLine–класса Console пространства имен System

           Console.WriteLine(text);

       }

   }

}

Результат выполнения программы:

Метод Main объявляется внутри класса или структуры. 

Файлы исходного кода С# имеют расширение .cs. C#  программы состоят из одного или более исходных файлов. При компиляции C# программ получаются сборки. Сборки имеют расширение .exe или .dll, они реализованы как приложения или как библиотеки.

Общие сведения о системе общих типов (CTS).

Система общих типов определяет способ объявления, использования и управления типами во время выполнения.

Типы и переменные

There are two kinds of types in C#: value types and reference types.

Система общих типов поддерживает две общие категории типов: типы значений и ссылочные типы.

Переменные типа значений содержат данные.

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

К типам значений в C# относятся простые типы, перечисляемые типы, типы структур и обнуляемые типы. К ссылочным типам в C# относятся типы классов, типы интерфейсов, типы массивов и типы делегатов.

Система общих типов CTS в платформе .NET Framework поддерживает следующие категории типов: (из Спецификации языка C# версии 3.0)

Category

Description

Value
types

Simple types

Signed integral: sbyte, short, int, long

Unsigned integral: byte, ushort, uint, ulong

Unicode characters: char

IEEE floating point: float, double

High-precision decimal: decimal

Boolean: bool

Enum types

User-defined types of the form enum E {...}

Struct types

User-defined types of the form struct S {...}

Nullable types

Extensions of all other value types with a null value

Reference
types

Class types

Ultimate base class of all other types: object

Unicode strings: string

User-defined types of the form class C {...}

Interface types

User-defined types of the form interface I {...}

Array types

Single- and multi-dimensional, for example, int[] and int[,]

Delegate types

User-defined types of the form e.g. delegate int D(...)

Для создания нового типа в программах на языке C# его необходимо определить. Можно определить пять пользовательских типов: классы, структуры, интерфейсы, перечисления и делегаты.

Классы и объекты

Класс — это структура данных, объединяющая состояние (поля) и действия (методы и другие функции-члены). Экземпляры класса создаются с помощью оператора new. Класс может содержать статические члены или члены экземпляра. Статические члены принадлежат классам. Члены экземпляра принадлежат объектам (экземплярам класса).

В типе можно определить следующие члены: (Джеффри Рихтер CLR via C#. Программирование на платформе Microsoft .NET Framework 2.0 на языке C# Питер, Русская Редакция 2007)

Константа. Идентификатор, определяющий постоянную величину. Константы связаны с типом, а не с экземпляром.

Поле. Представляет неизменяемое или изменяемое значение. Поле может быть статическим – тогда оно является частью типа и экземплярным  - тогда  оно является частью объекта.

Метод. Представляет собой функцию, выполняющую операции, которые изменяют или запрашивают состояние типа (статический метод) или объекта (экземплярный метод).

Конструктор экземпляра– метод, используемый для инициализации полей экземпляра при его создании.

Конструктор типа – метод, используемый для инициализации статических полей типа.

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

Перегруженный оператор.

Оператор преобразования.

Событие.

Тип. Позволяет определять другие вложенные в него типы.

Встроенные числовые типы (из Спецификации языка C# версии 3.0).

Category

Bits

Type

Range/Precision

Signed integral

8

sbyte

–128...127

16

short

–32,768...32,767

32

Int

–2,147,483,648...2,147,483,647

64

Long

–9,223,372,036,854,775,808...9,223,372,036,854,775,807

Unsigned integral

8

Byte

0...255

16

ushort

0...65,535

32

Uint

0...4,294,967,295

64

ulong

0...18,446,744,073,709,551,615

Floating point

32

float

1.5 × 10−45 to 3.4 × 1038, 7-digit precision

64

double

5.0 × 10−324 to 1.7 × 10308, 15-digit precision

Decimal

128

decimal

1.0 × 10−28 to 7.9 × 1028, 28-digit precision

Тип bool используется для представления логических значений  true или false.

Тип char используется для объявления символа Юникода (кода UTF-16).

Для создания переменных в программах C# используются оператор объявления. В операторе объявления необходимо указать тип и имя создаваемой переменной. Каждая переменная по значению должна быть инициализирована перед использованием (ей должно быть присвоено значение). Простые типы можно инициализировать с помощью литералов.

Пример. Объявление и инициализация переменных: sbyte, short, int, long. Форматирование числовых результатов при выводе данных на консоль.

using System;

namespace ConsoleApplication2

{

   class Program

   {

       static void Main(string[] args)

       {

           sbyte sByte1 = 127;

           short x = 32767;

           int i = 123;

           long long1 = 4294967296;

           Console.WriteLine("Переменная sbyte{0,4:d} Переменная short{1,6:d} " +

               " Переменная int{2,4:d} Переменная long{3,11:d}", sByte1, x, i,long1);

       }

   }

}

Для форматирования числовых результатов при выводе данных на консоль можно использовать составное форматирование. Общая форма записи спецификатора формата в составном форматировании имеет следующий вид: {номер_ аргумента[, ширина][: формат]}. Парные фигурные скобки ("{" и "}") здесь обязательны.

номер_ аргумента – описатель параметра, число, определяющее соответствующий объект из списка; индексация элементов ведется от нуля. Например, если имеется три объекта, то можно отформатировать сначала второй, а затем первый и третий объекты, задав следующую строку составного форматирования: "{1} {0} {2}".

Необязательный компонент ширина (alignment) — это целое число со знаком, которое служит для указания желательной ширины поля форматирования.

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

Пример. Объявление и инициализация переменных: float, double, decimal. Форматирование числовых результатов.

using System;

namespace ConsoleApplication2

{

   class Program

   {

       static void Main(string[] args)

       {

           float x = 3.5555F;

           double y = 3.5555;

           decimal myMoney = 300.5m;

           Console.WriteLine("Переменная float {0:f} Переменная double {1:f}" +

              " Переменная decimal {2:c}", x, y, myMoney);

       }

   }

}

using System;

namespace ConsoleApplication2

{

   class Program

   {

       static void Main(string[] args)

       {

           float x = 3.5555F;

           double y = 3.5555;

           decimal myMoney = 300.5m;

           Console.WriteLine("Переменная float {0:##.#} Переменная double {1:#.###}" +

               "Переменная decimal {2:c}", x, y, myMoney);

       }

   }

}

Литералы

Литерал — это представление значения в исходном коде.

Символьные литералы

char[] chars = new char[4];

chars[0] = 'X';        // Character literal

chars[1] = '\x0058';   // Hexadecimal

chars[2] = (char)88;   // Cast from integral type

chars[3] = '\u0058';   // Unicode

логические литералы
true
false

Литерал_null
null

Целочисленные литералы

Цифры от 0 до 9. Чтобы указать, что литерал представляет собой число без знака, он снабжается

суффиксом u или U, например:

uint i = 12u;

Console.WriteLine("{0:d}", i);

Суффиксы l или L применяются для создания литералов типа long и ulong:

long i = 1222L;

Console.WriteLine("{0:d}", i);

шестнадцатеричные числа

long i = 0xFFFF;

Console.WriteLine("{0:x}", i);

Литералы с плавающей точкой

float i = 10.0f;

Console.WriteLine("{0:f}", i);

double i = -3.7E-10D;

Console.WriteLine("{0:e}", i);

Строковые литералы

string i = "eeeeee\nyyyyyyyyy";

Console.WriteLine(i);

В языке С# строковый литерал может иметь префикс @. Он задает так называемый

буквальный литерал

string i =@"c:\";

Console.WriteLine(i);

Подробнее в спецификации языка C#.

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

Пример. Объявление и инициализация переменной типа  bool.  Вывод данных на консоль.

using System;

namespace ConsoleApplication3

{

   class Program

   {

       static void Main(string[] args)

       {

           bool b = true;

           // WriteLine автоматически конвертирует значение переменной b в текст.

           Console.WriteLine(b);

       }

   }

}

Тип char представляет 16-разрядные целые числа без знака в диапазоне от 0 до 65535. Набор возможных значений для типа char соответствует набору символов Юникода.

Пример. Объявление и инициализация четырех переменных типа char, имеющих одно и тоже значение - символ X.

using System;

namespace ConsoleApplication3

{

   class Program

   {

       static void Main(string[] args)

       {

           char char0 = 'X';        // Символьный литерал

           char char1 = '\x0058';   // шестнадцатеричная escape-последовательность

           char char2 = (char)88;   // Преобразование типа int в char

           char char3 = '\u0058';   //  Юникод

           Console.WriteLine("{0}  {1}  {2}  {3}", char0, char1, char2, char3);

       }

   }

}

Использование класса System.Console.

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

Пример. Чтение из стандартного входного потока и запись в стандартный выходной поток

using System;

namespace ConsoleApplication5

{

   class Program

   {

       static void Main(string[] args)

       {

           Console.WriteLine("Введите x");

           String name = Console.ReadLine();

           int a = int.Parse(name);

           Console.WriteLine(a);

       }

   }

}

В примере статический метод Console.WriteLine("Введите x") записывает данные в стандартный выходной поток; статический метод Console.ReadLine() считывает входные данные из стандартного входного потока. Возвращаемое методом Console.ReadLine() значение присваивается  переменной name типа String; статический метод int.Parse(name) преобразует строковое представление числа в эквивалентное ему 32-битовое целое число со знаком. Возвращаемое методом значение присваивается переменной а типа int; Статический метод Console.WriteLine(a) выводит результирующее целочисленное значение на консоль.

Пример

using System;

namespace ConsoleApplication5

{

   class Program

   {

       static void Main(string[] args)

       {

           int i = 5;

           double y = 9;

           Console.WriteLine(i.ToString("d")+"   "+y.ToString("f2"));

       }

   }

}

Использование  аргументов командной строки в консольном приложении.

К аргументам командной строки можно получить доступ при помощи дополнительного массива строк, связанного с методом Main. При выполнении приложения в Visual Studio можно указать аргументы командной строки в Страница "Отладка" в конструкторе проектов.

Пример.

using System;

namespace ConsoleApplication5

{

   class Program

   {

       static void Main(string[] args)

       {

           System.Console.WriteLine("parameter count = {0}", args.Length);

           for (int i = 0; i < args.Length; i++)

           {

               System.Console.WriteLine("Arg[{0}] = [{1}]", i, args[i]);

           }

       }

   }

}

Идентификаторы используются для обозначения переменных. В идентификаторах разрешены: знак подчеркивания в качестве начального символа, escape-последовательности Юникода, символ «@» в качестве префикса, чтобы можно было использовать ключевые слова в качестве идентификаторов.

Ключевое слово — это зарезервированная последовательность символов.

Операторы языка

Действия программы выражаются с помощью операторов. Оператор может состоять из одной строки кода, которая заканчивается точкой с запятой, или из ряда однострочных операторов в блоке. Блок оператора заключен в скобки ({}) и может содержать вложенные блоки.

Типы операторов.

Операторы объявления

Операторы выражений

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

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

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

Внедренный оператор. В операторах do, while, for и foreach, всегда есть внедренный оператор, следующий за ними. Этот внедренный оператор может быть либо одним оператором, либо несколькими операторами, заключенными в скобки ({}) в блоке оператора. Даже однострочные внедренные операторы могут быть заключены в скобки ({}).

Вложенные блоки операторов. Блоки операторов могут быть вложенными.

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

Оператор = называется простым оператором присваивания.

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

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

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

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

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

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

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

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

Каждый блок  или блок_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.

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

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

Из любого ссылочного типа к object.

Из производного класса к базовому классу.

Из типа класса S к типу интерфейса T (где S реализует T).

Из типа интерфейса S к типу интерфейса T (где S является производным от T).

Из любого типа массива к System.Array и реализуемым им интерфейсам.

Из типа_массива S, который имеет тип элементов SE, к типу_ массива T, который имеет тип элементов TE, если выполняются следующие условия:

S и T различаются только по типу элементов. Другими словами, типы S и T имеют одинаковое число измерений.

SE и TE являются ссылочными_типами.

Существует неявное преобразование ссылочного типа из SE к TE.

Пример

using System;

namespace ConsoleApplication5

{

   class Program

   {

       static void Main()

       {

           string[] t = new string[2] { "vv", "kkk" };

           object[] tt = new object[2];

           tt = t;

       }

   }

}

Пример

Если элемент массива ссылочного типа передается в качестве параметра ссылки или вывода, во время выполнения необходимо убедиться, что фактический тип элементов массива идентичен типу параметра.

using System;

namespace ConsoleApplication5

{

   class Program

   {

      static void F(ref object x) { }

      static void Main()

      {

          object[] a = new object[10];

          object[] b = new string[10];

          F(ref a[0]);  // Ok

          F(ref b[1]);  // ArrayTypeMismatchException

      }

   }

}

Понятие упаковки и распаковки является ключевым в системе типов C#. С помощью данных операций осуществляется связь между типами значений и ссылочными типами за счет возможности преобразования любого значения типа значений к типу object и обратно.

Преобразования упаковки

Преобразование упаковки обеспечивает неявное преобразование типа значений в ссылочный тип.

из любого типа_значений к типу object. Пример.

int i = 123;

object box = i;

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

Выражение приведения  типа используется для явного преобразования выражения в данный тип.

выражение_приведения_к_типу:
(   тип   )   унарное_выражение

Выражение_приведения_типа вида (T)E, где T является типом, а Eунарным_выражением, выполняет явное преобразование значения E в тип T.

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

Явные преобразования числовых типов предназначены для преобразования из одного числового_типа к другому числовому_типу, для которого не существует неявного преобразования:

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

Пример.  Для выполнения явного преобразования числового типа необходимо

заключить тип, в который производится преобразование (приведение), в скобки перед преобразуемым значением или переменной. Следующая программа выполнят приведение типа double в тип int. 

using System;

namespace ConsoleApplication5

{

   class Program

   {

       static void Main()

       {

           double x = 1234.7;

           int a;

           // Cast double to int.

           a = (int)x;

           System.Console.WriteLine(a);

       }

   }

}

Если x и y являются идентификаторами, то (x)y, (x)(y) и (x)(-y) являются выражениями приведения типа, а (x)-y не является, даже если x обозначает тип. Однако если x является ключевым словом, которое обозначает стандартный тип (например, int), то все четыре вида выражения являются выражениями приведения типа (потому что такое ключевое слово не может само быть выражением). Пример.

using System;

namespace ConsoleApplication5

{

   class Program

   {

       static void Main()

       {

           double x = 1234.7;

           int a;

           // Cast double to int.

           a = (int)-x;

           System.Console.WriteLine(a);

       }

   }

}

Результат

Операторы checked и unchecked

Операторы checked и unchecked используются для управления контекстом проверки переполнения для арифметических операций и преобразований целого типа.

выражение_checked:
checked   (   выражение   )

выражение_unchecked:
unchecked   (   выражение   )

Оператор checked вычисляет содержащееся в нем выражение в проверяемом контексте.

Оператор unchecked — в непроверяемом. Используется для подавления проверки переполнения при выполнении арифметических операций и преобразований с данными целого типа. В непроверяемом контексте арифметическое переполнение будет проигнорировано, а результат усечен.

В контексте checked для неконстантных выражений (выражений, которые вычисляются во время выполнения), возникает исключение System.OverflowException.

Пример использования оператора unchecked.

Явное преобразование из int к short, где

short

От -32 768 до 32 767

16-разрядное целое число со знаком

System.Int16

int

От -2 147 483 648 до 2 147 483 647

32-разрядное целое число со знаком

System.Int32

int i = 2147483647;

short ixx = unchecked((short)i);

Пример использования оператора checked.

Для неконстантных выражений (выражений, которые вычисляются во время выполнения), не заключенных в операторы или инструкции checked или unchecked, контекстом проверки переполнения по умолчанию является unchecked, если внешние факторы (например, переключатели компилятора и конфигурация среды исполнения) не заставляют установить контекст checked.

Пример.

int i = 2147483647;

short ixx = (short)i;

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

Если размер исходного типа меньше размера конечного, размер исходного значения расширяется до размера конечного типа за счет добавления знака или нулей.

Для преобразований из типа decimal к целому типу исходное значение округляется в сторону нуля до ближайшего целого значения. Результатом преобразования является полученное целое значение.

Пример.

decimal d = 10000.5m;

int i =(int)d;

Console.WriteLine(i);

Для типов с плавающей запятой и типа decimal отсутствует неявное преобразование, поэтому для преобразования между этими двумя типами следует использовать приведение. Пример.

Пример.

decimal myMoney = 99.9m;

double x = (double)myMoney;

Console.WriteLine(x);

Если убрать оператор явного преобразования, то программа завершится с ошибкой

Ошибка 1 Не удается неявно преобразовать тип "decimal" в "double". Существует явное преобразование (возможно, пропущено приведение типов)

Преобразования из double к float.

Значение типа double округляется до ближайшего значения типа float. При переполнении арифметической операции или делении на ноль исключение никогда не вызывается, потому что типы чисел с плавающей запятой основаны на стандарте IEEE 754 и включают правила для представления бесконечности и нечисловых значений (NaN).

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

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

  •  Из object любому другому ссылочному_типу.
  •  Из любого типа_класса S к любому типу_класса T, если S является базовым классом для T.

Пользовательские явные преобразования

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

Пример

int numVal = Convert.ToInt32("29");

Преобразования распаковки.

Преобразование распаковки обеспечивает явное преобразование ссылочного_типа к типу_значений.

Пример.

int i = 123;

object box = i;

i = 666;

i = (int)box;


Выражения.

Выражения состоят из операндов и операторов. Операторы в выражении указывают, какие операции производятся с операндами. К операторам относятся, например, +, -, *, / и new. К операндам относятся, например, литералы, поля, локальные переменные и выражения.

Существует три типа операторов.

  •  Унарные операторы. У унарного оператора есть только один операнд и оператор может записываться в префиксной форме (например, –x) или постфиксной форме (например, x++).
  •  двоичные операторы; У бинарных операторов два операнда и они записываются в виде инфикса (например, + y).
  •  Тернарный оператор. Существует только один тернарный оператор, ?:. В нем три операнда и используется инфиксная запись (c? x: y).

Порядок вычисления операторов в выражении определяется приоритетом и ассоциативностью операторов (§Ошибка! Источник ссылки не найден.).

Операнды в выражении вычисляются слева направо.