Скачать презентацию Лекция 3 Структура программы Программа на Скачать презентацию Лекция 3 Структура программы Программа на

C#_lection3 - общее.ppt

  • Количество слайдов: 62

Лекция 3 Лекция 3

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

Пример программы class Console. Hello. World { public static void Main() //Главная функция программы Пример программы class Console. Hello. World { public static void Main() //Главная функция программы {//Начало функции(блока) System. Console. Write. Line(“Hello world!!!”); //Вывод на экран } //Конец функции(блока) }

Методы Write и Write. Line using System; class console { public static void Main() Методы Write и Write. Line using System; class console { public static void Main() { int a = 1509; int b = 744; int c = a+b;

Console. Write(“The sum of ”); Console. Write(a); Console. Write(“ and “); Console. Write(b); Console. Console. Write(“The sum of ”); Console. Write(a); Console. Write(“ and “); Console. Write(b); Console. Write(“ equals “); Console. Write. Line(c); Console. Write. Line(“The sum of ” + a + “and “ + b + “equals” + c); Console. Write. Line(“The sum of {0} and {1} equals {2}”, a, b, c); }}

 • {0}, {1}, {2} – поля подстановки. • Поля подстановки могут содержать дополнительную • {0}, {1}, {2} – поля подстановки. • Поля подстановки могут содержать дополнительную информацию Скажем {0: C} представляет число как денежную сумму: показывается знак доллара (или другой символ валюты в зависимости от региональных параметров ОС), запятая, два десятичных знака, если число отрицательное, то строка заключается в скобки. Поле подстановки {0: Х 8} показывает число в шестнадцатеричном виде, при необходимости дополняя его нулями до 8 знаков. Вот некоторые примеры спецификаций формата в применении к целом) числу 12. 345:

Тип форматирования Currency Decimal Exponential Код Результат формата C $12, 345. 00 C 1 Тип форматирования Currency Decimal Exponential Код Результат формата C $12, 345. 00 C 1 $12, 345. 0 C 7 $12, 345. 0000000 D 12345 D 1 12345 D 7 0012345 E 1. 234500 E+004 E 1 1. 2 E+004 E 7 1. 2345000 E+004

Тип Код форматирования формата Fixed point General Hexadecimal F F 1 F 7 G Тип Код форматирования формата Fixed point General Hexadecimal F F 1 F 7 G G 1 G 7 X X 1 X 7 Результат 12, 345. 0000000 12345 1 E 4 12345 3039 0003039

static void Main() { Console. Write. Line( static void Main() { Console. Write. Line("C Format: {0, 14: C} t{0: C 2}", 12345. 678); Console. Write. Line("D Format: {0, 14: D} t{0: D 6}", 123); Console. Write. Line("E Format: {0, 14: E} t{0: E 8}", 12345. 6789); Console. Write. Line("G Format: {0, 14: G} t{0: G 10}", 12345. 6789); Console. Write. Line("N Format: {0, 14: N} t{0: N 4}", 12345. 6789); Console. Write. Line("X Format: {0, 14: X} ", 1234); Console. Write. Line("P Format: {0, 14: P} ", 0. 9); }

Чтение данных • string Console. Read. Line(); • Преобразование данных • Объект Convert Методы Чтение данных • string Console. Read. Line(); • Преобразование данных • Объект Convert Методы Convert. To. Тип(Тип); Convert. To. Double(string); • Метод Parse

using System; public class Parse. Int 32 { public static void Main() { Convert( using System; public class Parse. Int 32 { public static void Main() { Convert(" 179 "); Convert(" -204 "); Convert(" +809 "); Convert(" 178. 3"); } private static void Convert(string value) { try { int number = Int 32. Parse(value); Console. Write. Line("Converted '{0}' to {1}. ", value, number); } catch (Format. Exception) { Console. Write. Line("Unable to convert '{0}'. ", value); } }

Исключения Parse • Argument. Null. Exception Параметр s имеет значение Nothing. • Format. Exception Исключения Parse • Argument. Null. Exception Параметр s имеет значение Nothing. • Format. Exception Формат параметра s является неправильным. • Overflow. Exception Параметр s представляет число, которое меньше значения Min. Value или больше значения Max. Value.

Классы и структуры Схожесть Оба типа определяются пользователем Оба могут реализовывать несколько интерфейсов Оба Классы и структуры Схожесть Оба типа определяются пользователем Оба могут реализовывать несколько интерфейсов Оба могут содержать • Данные – Поля, константы, события, массивы • Функции – Методы, свойства, индексаторы, операторы, конструкторы • Определения типов – Классы, структуры, перечисления, интерфейсы, делегаты

Классы и структуры Различия Класс Cтруктура Ссылочный тип Размерный тип Может иметь деструктор Нет Классы и структуры Различия Класс Cтруктура Ссылочный тип Размерный тип Может иметь деструктор Нет деструктора Может наследоваться от любого типа ссылок Наследование не допускается (только от System. Value. Type) Может иметь определяемый пользователем конструктор без параметров Нет определяемого пользователем конструктора без параметров

Классы и структуры Структуры C# и структуры C++ Структуры C++ То же что и Классы и структуры Структуры C# и структуры C++ Структуры C++ То же что и класс C++ но все члены public Структуры C# Определяемый пользователем размерный тип значений Всегда размещается на стеке или как член класса Может размещаться в куче, на стеке или как член класса (может использоваться как значение или ссылка) Члены структуры всегда public Члены структуры могут быть public, internal или private

Структура public struct Point { int x, y; public Point(int x, int y) { Структура public struct Point { int x, y; public Point(int x, int y) { this. x = x; this. y = y; } public int X { get { return x; } set { x = value; } } public int Y { get { return y; } set { y = value; } } } Point p = new Point(2, 5); p. X += 100; int px = p. X; // px = 102

Класс public class Car : Vehicle { public enum Make { GM, Honda, BMW Класс public class Car : Vehicle { public enum Make { GM, Honda, BMW } Make make; string vid; Point location; Car(Make m, string vid; Point loc) { this. make = m; this. vid = vid; this. location = loc; } public void Drive() { Console. Write. Line(“vroom”); } } Car c =new Car(Car. Make. BMW, “JF 3559 QT 98”, new Point(3, 7)); c. Drive();

Классы и структуры Статические члены и члены экземпляра • По умолчанию, члены уникальны для Классы и структуры Статические члены и члены экземпляра • По умолчанию, члены уникальны для каждого экземпляра • Каждый экземпляр имеет свои собственные значения полей • Методы работают с определённым экземпляром • Статические члены уникальны для типа • Статические методы не могут работать с данными экземпляра • В статических методах нет переменной this • Это в действительности глобальные данные и функции в ООП

Статические члены и члены экземпляров • Как и в C++, вы можете определить член Статические члены и члены экземпляров • Как и в C++, вы можете определить член класса как статический (static member) или член экземпляра (instance member). • По умолчанию каждый член определен как член экземпляра. Это значит, что для каждого экземпляра класса делается своя копия этого члена. Когда член объявлен как статический, имеется лишь одна его копия. • Статический член создается при загрузке содержащего класс приложения и существует в течение жизни приложения. Поэтому вы можете обращаться к члену, даже если экземпляр класса еще не создан.

using System; class Inst. Count { public Inst. Count(){ instance. Count++; } static public using System; class Inst. Count { public Inst. Count(){ instance. Count++; } static public int instance. Count = 0; } class App. Class { public static void Main() { Console. Write. Line(Inst. Count. instance. Count); Inst. Count id = new Inst. Count(); Console. Write. Line(Inst. Count. instance. Count); Inst. Count id 2 = new Inst. Count(); Console. Write. Line(Inst. Count. instance. Count); } }

 • В этом примере выходная информация будет следующая: • 0 • 1 • • В этом примере выходная информация будет следующая: • 0 • 1 • 2

Классы и структуры Модификаторы доступа • Модификаторы доступа указывают кто может использовать тип или Классы и структуры Модификаторы доступа • Модификаторы доступа указывают кто может использовать тип или член • Модификаторы доступа управляют инкапсуляцией • Типы верхнего уровня (непосредственно в пространствах имён) могут быть public или internal • Члены классов могут быть public, private, protected, internal, или protected internal • Члены структур могут быть public, private или internal

Классы и структуры Модификаторы доступа модификатор доступа: Тогда член типа T в сборке A Классы и структуры Модификаторы доступа модификатор доступа: Тогда член типа T в сборке A доступен public private Всем Только внутри T (по умолчанию) типу T или типам наследованным от T protected internal Типам внутри A типу T или типам наследованным от T или типам внутри A

Классы и структуры Абстрактные классы • Нельзя сделать экземпляр абстрактного класса • Предполагается использовать Классы и структуры Абстрактные классы • Нельзя сделать экземпляр абстрактного класса • Предполагается использовать как базовый класс • Может содержать абстрактные и не абстрактные функции • Похож на интерфейс • Не может быть запечатан

Классы и структуры Запечатанные (sealed) классы • Запечатанный класс не может использоваться как базовый Классы и структуры Запечатанные (sealed) классы • Запечатанный класс не может использоваться как базовый класс • Запечатанный класс не может быть абстрактным • Все структуры неявно запечатаны • Зачем запечатывать класс? – Для предотвращения непреднамеренного наследования – Оптимизация кода – Адреса виртуальных функций могут быть определены во время компиляции

Классы и структуры this Ключевое слово this предопределённая переменная доступная в нестатических методах используется Классы и структуры this Ключевое слово this предопределённая переменная доступная в нестатических методах используется для устранения неоднозначности при доступе к данным class Person { string name; public Person(string name) { this. name = name; } public void Introduce(Person p) { if (p != this) Console. Write. Line(“Hi, I’m “ + name); } }

Классы и структуры base Ключевое слово base используется для доступа к членам класса которые Классы и структуры base Ключевое слово base используется для доступа к членам класса которые скрыты совпадающими именами членов текущего класса class Shape { int x, y; public override string To. String() { return "x=" + x + ", y=" + y; } } class Circle : Shape { int r; public override string To. String() { return base. To. String() + ", r=" + r; }}

Классы и структуры Константа это член класса который вычисляется во время компиляции и является Классы и структуры Константа это член класса который вычисляется во время компиляции и является по сути статическим например Math. PI public class My. Class { public const string version = “ 1. 0. 0”; public const string s 1 = “abc” + “def”; public const int i 3 = 1 + 2; public const double PI_I 3 = i 3 * Math. PI; public const double s = Math. Sin(Math. PI); . . . }

Классы и структуры Поля • Поле это переменная член класса/структуры • Содержит данные класса Классы и структуры Поля • Поле это переменная член класса/структуры • Содержит данные класса или структуры • Может содержать: – Экземпляр класса (ссылка), – Экземпляр структуры (собственно данные), или – Массив экземпляров классов или структур (массив в действительности ссылка)

Классы и структуры Поля только для чтения • Похожи на константы, но инициализируются во Классы и структуры Поля только для чтения • Похожи на константы, но инициализируются во время исполнения в месте объявления или в конструкторе • После инициализации, не могут быть изменены • Отличаются от констант • Инициализируются во время исполнения (а не при компиляции) • Не надо перекомпилировать тех кто ими пользуется • Могут быть статическими или на экземпляр public class My. Class { public static readonly double d 1 = Math. Sin(Math. PI); public readonly string s 1; public My. Class(string s) { s 1 = s; } }

Классы и структуры Свойства • Свойство это виртуальное поле • Выглядит как поле, но Классы и структуры Свойства • Свойство это виртуальное поле • Выглядит как поле, но реализуется в коде • Может быть только чтение, только запись, или чтение/запись public class Button: Control { private string caption; public string Caption { get { return caption; } set { caption = value; Repaint(); } } } Button b = new Button(); b. Caption = "OK"; String s = b. Caption;

Классы и структуры Индексаторы • Индексатор позволяет использовать экземпляр как виртуальный массив • Может Классы и структуры Индексаторы • Индексатор позволяет использовать экземпляр как виртуальный массив • Может быть переопределён (например индекс по целому и по строке) • Может быть только чтение, только запись, или чтение/запись

public class List. Box: Control { private string[] items; public string this[int index] { public class List. Box: Control { private string[] items; public string this[int index] { get { return items[index]; } set { items[index] = value; Repaint(); } } } List. Box list. Box = new List. Box(); list. Box[0] = "hello"; Console. Write. Line(list. Box[0]);

Классы и структуры Методы • Весь код исполняется в методах • Конструкторы, деструкторы и Классы и структуры Методы • Весь код исполняется в методах • Конструкторы, деструкторы и операторы это специальные типы методов • Свойства и индексаторы реализуются с помощью методов get/set • Методы имеют список аргументов • Методы содержат директивы • Методы могут возвращать значения Если возвращаемый тип не void

Классы и структуры Передача аргументов методам • По умолчанию передаётся значение • Создаётся копия Классы и структуры Передача аргументов методам • По умолчанию передаётся значение • Создаётся копия данных которая передаётся методу • Для типов значений, переменная не может быть изменена методом • Для типов ссылок, экземпляр может быть изменён методом, но сама переменная не может быть изменена

Классы и структуры Передача аргументов методам • Модификатор ref заставляет передавать ссылку на аргумент Классы и структуры Передача аргументов методам • Модификатор ref заставляет передавать ссылку на аргумент • Метод может изменить переменную • Необходимо указать модификатор ref в определении метода и в месте вызова • Перед вызовом переменная должна иметь значение void Ref. Function(ref int p) { p++; } int x = 10; Ref. Function(ref x); // x is now 11

Классы и структуры Передача аргументов методам • Модификатор out заставляет возвращать аргументы по ссылке Классы и структуры Передача аргументов методам • Модификатор out заставляет возвращать аргументы по ссылке • Позволяет методу инициализировать переменную • Следует указывать модификатор out в определении метода и в коде который его вызывает • Следует присваивать значение аргументу перед выходом из метода void Out. Function(out int p) { p = 22; } int x; Out. Function(out x); // x is now 22

Классы и структуры Массивы параметров • Методы могут иметь переменное число аргументов, т. н. Классы и структуры Массивы параметров • Методы могут иметь переменное число аргументов, т. н. массив параметров • Ключевое слово params определяет массив параметров • Он должен быть последним аргументом int Sum(params int[] int. Arr) { int sum = 0; foreach (int i in int. Arr) sum += i; return sum; } int sum = Sum(13, 87, 34);

Классы и структуры Виртуальные методы • Методы могут быть виртуальными и не виртуальными (по Классы и структуры Виртуальные методы • Методы могут быть виртуальными и не виртуальными (по умолчанию) • Не виртуальные методы не полиморфны • Они не могут быть переопределены • Не виртуальные методы не могут быть абстрактными class Foo { public void Do. Something(int i) {. . . }} Foo f = new Foo(); f. Do. Something();

Классы и структуры Виртуальные методы • Определяются в базовом классе • Могут быть переопределены Классы и структуры Виртуальные методы • Определяются в базовом классе • Могут быть переопределены в наследующих классах • Наследующие классы содержат свою собственную особенную реализацию • Могут содержать ‘реализацию по умолчанию’ • Если ‘реализации по умолчанию’ нет используется абстрактный метод • Форма полиморфизма • Свойства, индексаторы и события тоже могут быть виртуальными

Классы и структуры Виртуальные методы class Shape { public virtual void Draw() {. . Классы и структуры Виртуальные методы class Shape { public virtual void Draw() {. . . } } class Box : Shape { public override void Draw() {. . . } } class Sphere : Shape { public override void Draw() {. . . } } void Handle. Shape(Shape s) { s. Draw(); . . . } Handle. Shape(new Box()); Handle. Shape(new Sphere()); Handle. Shape(new Shape());

Классы и структуры Абстрактные методы • Абстрактный метод это виртуальный метод без реализации • Классы и структуры Абстрактные методы • Абстрактный метод это виртуальный метод без реализации • Должен принадлежать абстрактному классу • Предполагается что будет реализован в наследующем классе

Классы и структуры Абстрактные методы abstract class Shape { public abstract void Draw(); } Классы и структуры Абстрактные методы abstract class Shape { public abstract void Draw(); } class Box : Shape { public override void Draw() {. . . } } class Sphere : Shape { public override void Draw() {. . . } }

void Handle. Shape(Shape s) { s. Draw(); …} Handle. Shape(new Box()); Handle. Shape(new Sphere()); void Handle. Shape(Shape s) { s. Draw(); …} Handle. Shape(new Box()); Handle. Shape(new Sphere()); Handle. Shape(new Shape()); // Ошибка!

Классы и структуры Конструкторы • Конструктор экземпляра это специальный метод, который вызывается когда создаётся Классы и структуры Конструкторы • Конструктор экземпляра это специальный метод, который вызывается когда создаётся новый экземпляр класса • Производит инициализацию экземпляра • Может быть переопределён • Если в классе не указан конструктор, создаётся конструктор без параметров по умолчанию • Структура не может иметь конструктор без параметров

Классы и структуры Инициализаторы конструктора Один конструктор может вызвать другой с помощью инициализатора Можно Классы и структуры Инициализаторы конструктора Один конструктор может вызвать другой с помощью инициализатора Можно вызвать this(. . . ) или base(. . . ) Инициализатор по умолчанию base() class B { private int h; public B() { } public B(int h) { this. h = h; } } class D : B { private int i; public D() : this(24) { } public D(int i) { this. i = i; } public D(int h, int i) : base(h) { this. i = i; } }

Классы и структуры Статические конструкторы • Статический конструктор содержит код который вызывается один раз Классы и структуры Статические конструкторы • Статический конструктор содержит код который вызывается один раз для класса • Гарантированно исполняется до того как будет создан первый экземпляр класса или структуры и перед первой операцией с каким либо статическим членом класса или структуры • Других гарантий последовательности исполнения нет • У типа может быть только один статический конструктор • Этот конструктор не должен иметь параметров

Классы и структуры Деструкторы • Деструктор это метод который вызывается перед тем как экземпляр Классы и структуры Деструкторы • Деструктор это метод который вызывается перед тем как экземпляр передаётся сборщику мусора • Используется для освобождения ресурсов используемых экземпляром, сохранения параметров, и т. п. • Только классы имеют деструкторы class Foo { ~Foo() { Console. Write. Line(“Destroyed {0}”, this); } }

Классы и структуры Деструкторы • В отличие от C++, C# деструкторы недетерминированы • Время Классы и структуры Деструкторы • В отличие от C++, C# деструкторы недетерминированы • Время когда они вызываются не определено • Гарантируется что они вызываются перед выключением компьютера

Классы и структуры Переопределение операторов • Определяемые пользователем операторы • Должны быть статическими методами Классы и структуры Переопределение операторов • Определяемые пользователем операторы • Должны быть статическими методами class Car { string vid; public static bool operator ==(Car x, Car y) { return x. vid == y. vid; } }

Классы и структуры Переопределение операторов Переопределяемые унарные операторы ! ~ - ++ -- Переопределяемые Классы и структуры Переопределение операторов Переопределяемые унарные операторы ! ~ - ++ -- Переопределяемые бинарные операторы + == % != * | > / & < >> ^ >= << <=

Классы и структуры Переопределение операторов • Нельзя переопределить доступ к членам типа, вызов методов, Классы и структуры Переопределение операторов • Нельзя переопределить доступ к членам типа, вызов методов, операторы присвоения, и операторы: sizeof, new, is, as, typeof, • checked, unchecked, &&, ||, и ? : • Операторы && и || автоматически вычисляются из & и | • Переопределение бинарного оператора (например *) неявно переопределяет и соответствующий оператор присваивания (*=)

Классы и структуры Переопределение операторов struct Vector { int x, y; public Vector(x, y) Классы и структуры Переопределение операторов struct Vector { int x, y; public Vector(x, y) { this. x = x; this. y = y; } public static Vector operator +(Vector a, Vector b) { return Vector(a. x + b. x, a. y + b. y); }. . . }

Классы и структуры Операторы преобразования • Определяемые пользователем явные и неявные преобразования class Note Классы и структуры Операторы преобразования • Определяемые пользователем явные и неявные преобразования class Note { int value; // Convert to hertz – no loss of precision public static implicit operator double(Note x) { return. . . ; } // Convert to nearest note public static explicit operator Note(double x) { return. . . ; } }

Классы и структуры Включённые типы • Объявляются внутри другого типа • Включение типа имеет Классы и структуры Включённые типы • Объявляются внутри другого типа • Включение типа имеет три преимущества: • Включённый тип получает доступ ко всем членам типа который его включает, независимо от модификатора доступа • Включённый тип может быть скрыт от других типов • Доступ к включённому типу извне типа который его включает требует указания имени типа • Включённые типы могут использовать директиву new для скрытия унаследованных классов • В отличие от внутренних классов Java, включённые типы не подразумевают никакой связи между экземплярми

Классы и структуры Оператор is • Оператор is используется для динамической проверки совместимости типа Классы и структуры Оператор is • Оператор is используется для динамической проверки совместимости типа объекта с заданным типом во время исполнения static void Do. Something(object o) { if (o is Car) ((Car)o). Drive(); } • Не пренебрегайте оператором is: его использование предпочтительно в работе с иерархией типов с полиморфными методами

Классы и структуры Оператор as • Оператор as пытается преобразовать переменную к указанному типу; Классы и структуры Оператор as • Оператор as пытается преобразовать переменную к указанному типу; если такое преобразование невозможно возвращается null static void Do. Something(object o) { Car c = o as Car; if (c != null) c. Drive(); } • Более эффективен чем оператор is: проверяет и преобразовывает в одной операции • Даёт тот же набор предупредительных сообщений при компиляции что и оператор is

Оператор typeof • Оператор typeof возвращает объект System. Type для указанного типа • • Оператор typeof • Оператор typeof возвращает объект System. Type для указанного типа • • • Console. Write. Line(typeof(int). Full. Name); Console. Write. Line(typeof(System. Int 32). Name); Console. Write. Line(typeof(float). Module); Console. Write. Line(typeof(double). Is. Public); Console. Write. Line(typeof(Car). Member. Type);

Интерфейсы • Интерфейс это тип • Включает методы, свойства, индексаторы, события • Любой класс Интерфейсы • Интерфейс это тип • Включает методы, свойства, индексаторы, события • Любой класс или структура реализующая интерфейс должна поддерживать все части контракта Интерфейсы не содержат реализации • Класс или структура включающая интерфейс должна обеспечивать его реализацию Интерфейсы обеспечивают полиморфизм • Многие классы и структуры могут реализовывать один и тот же интерфейс

Интерфейсы public interface IDelete { void Delete(); } public class Text. Box : IDelete Интерфейсы public interface IDelete { void Delete(); } public class Text. Box : IDelete { public void Delete() {. . . } } public class Car : IDelete { public void Delete() {. . . } } Text. Box tb = new Text. Box(); IDelete i. Del = tb; i. Delete(); Car c = new Car(); i. Del = c; i. Delete();

Интерфейсы Множественное наследование • Классы и структуры могут наследовать несколько интерфейсов • Интерфейс может Интерфейсы Множественное наследование • Классы и структуры могут наследовать несколько интерфейсов • Интерфейс может быть наследован от нескольких интерфейсов interface IControl { void Paint(); } interface IList. Box: IControl { void Set. Items(string[] items); }

Интерфейсы Если два интерфейса имеют одинаковое имя метода, вы можете явно указать интерфейс + Интерфейсы Если два интерфейса имеют одинаковое имя метода, вы можете явно указать интерфейс + метод для того чтобы не перепутать реализации interface IControl { void Delete(); } interface IList. Box: IControl { void Delete(); } interface ICombo. Box: IText. Box, IList. Box { void IControl. Delete(); void IList. Box. Delete(); }