Программирование

Автор работы: Пользователь скрыл имя, 28 Марта 2012 в 11:49, курс лекций

Описание

Лекции по дисциплине "Программирование"

Содержание

Лекция 1. Состав языка Типы данных Переменные и операции

Лекция 2. Линейные программы

Лекция 3. Простейшие операторы. Операторы ветвления

Лекция 4. Операторы цикла и передачи управления

Лекция 5. Обработка исключительных ситуаций

Лекция 6. Классы: основные понятия Описание класса

Лекция 7. Параметры методов

Лекция 8. Конструкторы и свойства

Лекция 9. . Массивы

Лекция 10. Символы и строки

Лекция 11 Дополнительные возможности методов. Индексаторы

Лекция 12. Операции класса. Деструкторы

Лекция 13. Наследование классов

Лекция 14. Интерфейсы

Лекция 15. Стандартные интерфейсы .NET

Лекция 16. Структуры и перечисления

Лекция 17. Делегаты

Лекция 18. События

Работа состоит из  1 файл

Лекции C#.doc

— 847.00 Кб (Скачать документ)

 

Символ, представленный в виде шестнадцатеричного кода, начинается с префикса \0x, за которым следует код символа. Числовое значение должно находиться в диапазоне от 0 до 216 – 1, иначе возникает ошибка компиляции.

Escape-последовательности Unicode служат для представления символа в кодировке Unicode с помощью его кода в шестнадцатеричном виде с префиксом \u или \U, например, \u00F2, \U00010011. Коды в диапазоне от \U10000 до \U10FFFF представляются в виде двух последовательных символов; коды, превышающие \U10FFFF, не поддерживаются.

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

"Никто не доволен своей\nвнешностью, но каждый доволен\nсвоим умом"

 

Этот литерал при выводе будет выглядеть так:

Никто не доволен своей

внешностью, но каждый доволен

своим умом

 

В C# есть и второй вид литералов — дословные (verbatim strings). Эти литералы предваряются символом @, который отключает обработку управляющих последовательностей и позволяет получать строки в том виде, в котором они записаны. Например, приведеннй выше литерал в дословном виде выглядит так:

@"Никто не доволен своей

внешностью, но каждый доволен

своим умом"

 

Чаще всего дословные литералы применяются при задании полного пути файла. Сравните два варианта записи одного и того же пути:

"C:\\app\\bin\\debug\\a.exe"

@"C:\app\bin\debug\a.exe"

 

Строка может быть пустой (записывается парой смежных двойных кавычек ""), пустая символьная константа недопустима.

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

Комментарии

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

Однострочный комментарий начинается с двух символов прямой косой черты (//) и заканчивается символом перехода на новую строку, многострочный заключается между символами-скобками /* и */ и может занимать часть строки, целую строку или несколько строк. Комментарии не вкладываются друг в друга.

Кроме того, в языке есть еще одна разновидность комментариев, которые начинаются с трех подряд идущих символов косой черты (///). Они предназначены для формирования документации к программе в формате XML. Компилятор извлекает эти комментарии из программы, проверяет их соответствие правилам и записывает их в отдельный файл.

 

Типы данных

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

Тип данных однозначно определяет:

                    внутреннее представление данных, а следовательно и множество их возможных значений;

                    допустимые действия над данными (операции и функции).

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

Каждое выражение в программе имеет определенный тип. Компилятор использует информацию о типе при проверке допустимости описанных в программе действий.

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

Классификация типов

Типы можно классифицировать по разным признакам. Если принять за основу строение элемента, все типы можно разделить на простые (не имеют внутренней структуры) и структурированные (состоят из элементов других типов). По своему «создателю» типы можно разделить на встроенные (стандартные) и определяемые программистом (рис. 2.1). Для данных статического типа память выделяется в момент объявления, при этом ее требуемый объем известен. Для данных динамического типа размер данных в момент объявления может быть неизвестен, и память под них выделяется по запросу в процессе выполнения программы.

 

Встроенные типы

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

Таблица 2.1. Встроенные типы C# Название

Ключевое слово

Тип .NET

Диапазон значений

Описание

Размер, битов

Логический тип

bool

Boolean

true, false

 

 

Целые типы

sbyte

SByte

От –128 до 127

Со знаком

8

 

byte

Byte

От 0 до 255

Без знака

8

 

short

Int16

От –32768 до 32767

Со знаком

16

 

ushort

UInt16

От 0 до 65535

Без знака

16

 

int

Int32

От –2  109 до 2  109

Со знаком

32

 

uint

UInt32

От 0 до 4  109

Без знака

32

 

long

Int64

От –9  1018 до 9  1018

Со знаком

64

 

ulong

UInt64

От 0 до 18  1018

Без знака

64

Символьный тип

char

Char

От U+0000 до U+ffff

Unicode-символ

16

Вещественные

float

Single

От 1.5  10-45 до 3.4  1038

7 цифр

32

 

double

Double

От 5.010-324 до 1.7  10308

15–16 цифр

64

Финансовый тип

decimal

Decimal

От 1.0  10-28 до 7.9  1028

28–29 цифр

128

Строковый тип

string

String

Длина ограничена объемом доступной памяти

Строка из Unicode-символов

 

Тип object

object

Object

Можно хранить все, что угодно

Всеобщий предок

 

 

Целые типы, а также символьный, вещественные и финансовый типы можно объединить под названием арифметических типов.

Внутреннее представление величины целого типа - целое число в двоичном коде. В знаковых типах старший бит числа интерпретируется как знаковый (0 - положительное число, 1 - отрицательное).

Вещественные типы, или типы данных с плавающей точкой, хранятся в памяти компьютера иначе, чем целочисленные. Внутреннее представление вещественного числа состоит из двух частей — мантиссы и порядка, каждая часть имеет знак. Длина мантиссы определяет точность числа, а длина порядка — его диапазон. Все вещественные типы могут представлять как положительные, так и отрицательные числа. Чаще всего в программах используется тип double, поскольку его диапазон и точность покрывают большинство потребностей. Этот тип имеют вещественные литералы и многие стандартные математические функции.

Тип decimal предназначен для денежных вычислений, в которых критичны ошибки округления. Величины типа decimal позволяют хранить 28–29 десятичных разрядов. Тип decimal не относится к вещественным типам, у них различное внутреннее представление. Величины денежного типа даже нельзя использовать в одном выражении с вещественными без явного преобразования типа. Использование величин финансового типа в одном выражении с целыми допускается.

Любой встроенный тип C# соответствует стандартному классу библиотеки .NET, определенному в пространстве имен System. Везде, где используется имя встроенного типа, его можно заменить именем класса библиотеки.

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

Литералы (константы) тоже имеют тип. Если значение целого литерала находится внутри диапазона допустимых значений типа int, литерал рассматривается как int, иначе он относится к наименьшему из типов uint, long или ulong, в диапазон значений которого он входит. Вещественные литералы по умолчанию относятся к типу double.

Например, константа 10 относится к типу int (хотя для ее хранения достаточно и байта), а константа 2147 483 648 будет определена как uint. Для явного задания типа литерала служит суффикс, например, 1.1f, 1UL, 1000m. Явное задание применяется в основном для уменьшения количества неявных преобразований типа, выполняемых компилятором.

Типы-значения и ссылочные типы

Чаще всего типы C# разделяют по способу хранения элементов на типы-значения и ссылочные типы (рис. 2.2). Элементы типов-значений , или значимых типов (value types), представляют собой просто последовательность битов в памяти, необходимый объем которой выделяет компилятор. Иными словами, величины значимых типов хранят свои значения непосредственно. Величина ссылочного типа хранит не сами данные, а ссылку на них (адрес, по которому расположены данные). Сами данные хранятся в хипе.

Рисунок 2.3 иллюстрирует разницу между величинами значимого и ссылочного типов. Одни и те же действия над ними выполняются по-разному. Рассмотрим в качестве примера проверку на равенство. Величины значимого типа равны, если равны их значения. Величины ссылочного типа равны, если они ссылаются на одни и те же данные (на рисунке b и c равны, но a не равно b даже при одинаковых значениях). Из этого следует, что если изменить значение одной величины ссылочного типа, это может отразиться на другой.

Упаковка и распаковка

Для того чтобы величины ссылочного и значимого типов могли использоваться совместно, необходимо иметь возможность преобразования из одного типа в другой. Преобразование из типа-значения в ссылочный тип называется упаковкой (boxing), обратное преобразование — распаковкой (unboxing).

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

 

Переменные и операции

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

Пример описания целой переменной с именем a и вещественной переменной x:

int a; float x;

 

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

int a, b = 1;

float x = 0.1, y = 0.1f;

 

Здесь описаны:

                    переменная a типа int, начальное значение которой не присваивается;

                    переменная b типа int, ее начальное значение равно 1;

                    переменные х и y типа float, которым присвоены одинаковые начальные значения 0.1. Разница между ними состоит в том, что для инициализации переменной х сначала формируется константа типа double, а затем она преобразуется к типу float; переменной y значение 0.1 присваивается без промежуточного преобразования.

Рекомендуется всегда инициализировать переменные при описании. При инициализации можно использовать не только константу, но и выражение — главное, чтобы на момент описания оно было вычисляемым, например:

int b = 1, a = 100;

int x = b * a + 25;

 

Программа на C# состоит из классов, внутри которых описывают методы и данные. Переменные, описанные непосредственно внутри класса, называются полями класса. Им автоматически присваивается так называемое «значение по умолчанию» — как правило, это 0 соответствующего типа. Переменные, описанные внутри метода класса, называются локальными переменными. Их инициализация возлагается на программиста.

Так называемая область действия переменной, то есть область программы, где можно использовать переменную, начинается в точке ее описания и длится до конца блока, внутри которого она описана. Блок  — это код, заключенный в фигурные скобки. Основное назначение блока — группировка операторов. В C# любая переменная описана внутри какого-либо блока: класса, метода или блока внутри метода. Имя переменной должно быть уникальным в области ее действия. Область действия распространяется на вложенные в метод блоки.

class X    // начало описания класса X

{

   int A;      // поле A класса X

   int B;      // поле B класса X

 

   void Y()    // ----------------------------------------- метод Y класса Х

   {

      int C;      // локальная переменная C, область действия – метод Y

      int A;      // локальная переменная A (НЕ конфликтует с полем А)

 

      {           // ============ вложенный блок 1 ============

         int D;      // локальная переменная D, область действия – этот блок

//       int А;         недопустимо! Ошибка компиляции, конфликт с локальной

//                      переменной А

         С = B;      // присваивание переменной С поля В класса Х (**)

         С = this.A; // присваивание переменной С поля А класса Х (***)

      }           // ============ конец блока 1 ===============

 

      {           // ============ вложенный блок 2 ============

         int D;      // локальная переменная D, область действия – этот блок

      }           // ============ конец блока 2 ===============

 

   }           // ------------------------- конец описания метода Y класса X

 

}          // конец описания класса X

 

В листинге 3.1 приведен пример программы, в которой описываются и выводятся на экран локальные переменные.

Листинг 3.1. Описание переменных

using System;

namespace ConsoleApplication1

{    class Class1

    {    static void Main()

        {

            int     i = 3;

            double  y = 4.12;

            decimal d = 600m;

            string  s = "Вася";

 

            Console.Write( "i = " );  Console.WriteLine( i );

            Console.Write( "y = " );  Console.WriteLine( y );

            Console.Write( "d = " );  Console.WriteLine( d );

            Console.Write( "s = " );  Console.WriteLine( s );

        }

    }

}

 

Именованные константы

Можно запретить изменять значение переменной, задав при ее описании ключевое слово const, например:

Информация о работе Программирование