3_Tipy.pptx
- Количество слайдов: 44
Типы Types 1 Объектно-ориентированные технологии 14. 11. 2008
Типы C# является строго типизированным языком. Поэтому все операции проверяются компилятором на соответствие типов. Код в котором нарушается соответствие типов не компилируется. Таким образом предотвращаются ошибки и обеспечивается высокий уровень безопасности. Для этого у каждой переменной должен быть тип. Тип переменной определяет какие значения можно ей присваивать и какие действия можно с ней совершать. Типы в C# можно разделить на примитивные или встроенные типы и пользовательские типы. 2 Объектно-ориентированные технологии 14. 11. 2008
Примитивные типы 3 Объектно-ориентированные технологии 14. 11. 2008
Примитивные типы поддерживаются компилятором напрямую т. е. существуют инструкции для работы с этими типами. Всего существует 15 примитивных типов. Среди них 9 целочисленных типов, 2 типа с плавающей точкой, булевский тип, тип для последовательности символов, тип для финансовых вычислений и базовый тип для всех типов. 4 Объектно-ориентированные технологии 14. 11. 2008
Примитивные типы короткое название тип бит диапазон byte целый без знака 8 от 0 до 255 sbyte целый со знаком 8 от -128 до 127 int целый со знаком 32 от -2, 147, 483, 648 до 2, 147, 483, 647 uint целый без знака 32 от 0 до 4294967295 short целый со знаком 16 от -32, 768 до 32, 767 ushort целый без знака 16 от 0 до 65535 long целый со знаком 64 от -922337203685477508 до 922337203685477507 ulong целый без знака 64 от 0 до 18446744073709551615 char символ Unicode 16 используемые символы Unicode 5 Объектно-ориентированные технологии 14. 11. 2008
Примитивные типы короткое название float double bool object string decimal 6 тип бит диапазон число с плавающей точкой с двойной точностью базовый тип для всех типов последовательность символов тип для представления десятичных чисел с точностью до 29 знаков от -3. 402823 e 38 до 3. 402823 e 38 64 от -1. 79769313486232 e 308 до 1. 79769313486232 e 308 8 булевский тип 32 истина или ложь 128 от ± 1. 0 × 10 e− 28 до ± 7. 9 × 10 e 28 Объектно-ориентированные технологии 14. 11. 2008
Преобразования примитивных типов Примитивные типы допускают явные и неявные преобразования. Неявные преобразования допускаются тогда когда при преобразовании не может потеряться информация о значении. Если преобразовании информация о значении может быть потеряна допускаются только явные преобразования. 7 Объектно-ориентированные технологии 14. 11. 2008
Явные и неявные преобразования // неявные преобразования без потери информации int some. Int = 10; long some. Long = some. Int; float some. Float = 3. 14519; double some. Double = some. Float; // явные преобразования возможна потеря информации long some. Long = 10; int some. Int = (int) some. Long; double some. Double = 3. 14519; float some. Float = (float) some. Double; 8 Объектно-ориентированные технологии 14. 11. 2008
Допустимые неявные преобразования исходный тип получаемый тип byte sbyte, char sbyte, ushort, uint, ulong , char int sbyte, short, uint, ulong , char uint sbyte, short, ushort, int , char short sbyte, ushort, uint, ulong , char ushort sbyte, short, char long sbyte, short, ushort, int, ulong , char ulong sbyte, short, ushort, int, uint, long , char float sbyte, short, ushort, int, uint, long, ulong, char, decimal double sbyte, short, ushort, int, uint, long, ulong, char, float, decimal char sbyte, short decimal sbyte, short, ushort, int, uint, long, ulong, char, float, double 9 Объектно-ориентированные технологии 14. 11. 2008
Допустимые явные преобразования исходный тип получаемый тип byte short, ushort, int, uint, long, ulong, float, double , decimal sbyte short, int, long, float, double, decimal int long, float, double, decimal uint long, ulong, float, double, decimal short int, long, float, double, decimal ushort int, uint, long, ulong, float, double, decimal long float, double, decimal ulong float, double, decimal float double char ushort, int, uint, long, ulong, float, double, decimal 10 Объектно-ориентированные технологии 14. 11. 2008
Ссылочные типы и типы значений 11 Объектно-ориентированные технологии 14. 11. 2008
Ссылочные типы и типы значений C# поддерживает две разновидности типов: ссылочные типы и типы значений. Ссылочные типы объявляются с помощью ключевого слова class. Типы значений объявляются с помощью ключевого слова struct. Память для ссылочных типов выделяется из управляемой кучи. Память для типов значений обычно выделяется на стеке. Ссылочные типы напрямую наследуют класс System. Object. Типы значений наследуют тип System. Value. Type который наследует класс System. Object. Одной из разновидностью ссылочных типов являются типы перечисления. Перечисления наследуют System. Enumeration который непосредственно наследует System. Value. Type. Ссылочный тип может наследовать один другой ссылочный тип. Типы значений не могут наследовать другие типы и не могут наследоваться. И ссылочные типы и типы значений могут реализовывать несколько интерфейсов. 12 Объектно-ориентированные технологии 14. 11. 2008
Иерархия типов Object Value. Type Enum My. Enum. Type My. Val. Type My. Ref. Type 13 Объектно-ориентированные технологии 14. 11. 2008
Класс и структура class Some. Ref. Type // ссылочный тип { public int x; } struct Some. Val. Type // тип значения { public int x; } 14 Объектно-ориентированные технологии 14. 11. 2008
Использование класса и структуры class Program { static void Main() { Some. Ref. Type ref 1 = new Some. Ref. Type(); Some. Val. Type val 1 = new Some. Val. Type(); ref 1. x = 10; val 1. x = 10; Console. Write. Line("val 1: {0} ref 1: {1}", val 1. x, ref 1. x ); Some. Ref. Type ref 2 = ref 1; Some. Val. Type val 2 = val 1; ref 1. x=20; val 1. x=30; Some. Ref. Type ref 3 = ref 1; Console. Write("val 1: {0} val 2: {1}", val 1. x, val 2. x ); Console. Write. Line("ref 1: {0} ref 2: {1} ref 3: {2}", ref 1. x, ref 2. x, ref 3. x ); } } 15 Объектно-ориентированные технологии 14. 11. 2008
Стек и управляемая куча стек управляемая куча ref 1 x=10 стек управляемая куча ref 1 x=20 val 1 x=10 x=30 ref 2 val 2 x=10 ref 3 16 Объектно-ориентированные технологии 14. 11. 2008
Методы и поля 17 Объектно-ориентированные технологии 14. 11. 2008
Методы и поля Поле - это значение данных. Поле может быть статическим. В этом случае оно является частью самого типа. Поле может быть не статическим или полем экземпляра. В этом случае поле является частью состояния экземпляра типа. Метод - это функция которая может выполнять различные операции, запрашивать и вносить изменения в поля. Метод может быть статическим. В этом случае он может запрашивать и менять состояние типа. Метод может быть не статическим или методом экземпляра. В этом случае метод может запрашивать и изменять состояние конкретного экземпляра типа. 18 Объектно-ориентированные технологии 14. 11. 2008
Модификаторы доступа модификатор описание private доступен только для методов своего типа protected доступен только для методов своего типа и методов потомков internal доступен только для методов в своей сборке protected internal доступен только для методов в своей сборке, методов своего типа и методов потомков public доступен для всех методов во всех сборках 19 Объектно-ориентированные технологии 14. 11. 2008
Предопределённые атрибуты для методов описание static методу доступны только статические поля и методы методу доступны и экземплярные и статические поля и методы virtual вызывается метод производного класса даже если он приведён к базовому типу new метод не переопределяет метод базового класса override метод переопределяет виртуальный метод базового типа abstract производный тип должен реализовать метод с совпадающей сигнатурой final производный тип не может переопределять этот метод атрибуты для полей описание static поле является частью типа а не экземпляра readonly поле может быть записано только в конструкторе 20 Объектно-ориентированные технологии 14. 11. 2008
Определение методов и полей public class Employee // как будто класс был объявлен так { private int age; // поле экземпляра private static int n. Employees; // статическое поле } 21 public int get_Age() // метод экземпляра { return age; } public void set_Age(int value) // метод экземпляра { age = value; } public static int get_number. Of. Employees // статический метод { return n. Employees; } public static void set_number. Of. Employees(int value) // статический метод { n. Employees = value; } Объектно-ориентированные технологии 14. 11. 2008
Наследование и приведение типов 22 Объектно-ориентированные технологии 14. 11. 2008
Наследование и приведение типов В C# возможно использовать ссылочную переменную базового типа для хранения ссылки на объект любого производного класса. Такое отклонение от требования строгой совместимости типов не создаёт проблем так как все методы которые доступны по ссылке базового типа присутствуют в производных типах. Кроме того переменная какого типа бы не использовалась для хранения ссылки на объект настоящий тип объекта всегда можно узнать с помощью метода Get. Type. В C# возможно привести объект к своему типу или к одному из базовых типов. Если приведение осуществляется к типу ссылочной переменной хранящей ссылку на объект или его базовому типу можно использовать неявное приведение. В случае когда приведение осуществляется к типу потомку типа ссылочной переменной необходимо использовать явное приведение. В случае если тип к которому происходит приведение не является типов объекта или его базовым типом генерится исключение. 23 Объектно-ориентированные технологии 14. 11. 2008
Предопределённые атрибуты атрибут для типов описание abstract экземпляр типа не может быть создан sealed тип не может быть использован в качестве базового типа 24 Объектно-ориентированные технологии 14. 11. 2008
Наследование public class Base. Type { public virtual void Some. Method() { Console. Write. Line(" метод базового типа"); } } public class Derived. Type : Base. Type { public override void Some. Method() { Console. Write. Line(" метод типа потомка"); } } public static void Main() { Base. Type bt = new Derived. Type(); bt. Some. Method(); } 25 Объектно-ориентированные технологии 14. 11. 2008
Приведение типов public static void Main() { object o = new Some. Type(); Some. Type st = (Some. Type) o; } 26 Base. Type bt = new Derived. Type(); Derived. Type dt = (Derived. Type) bt; Объектно-ориентированные технологии 14. 11. 2008
Конструкторы 27 Объектно-ориентированные технологии 14. 11. 2008
Конструкторы экземпляров Конструктор экземпляра - это метод который задаёт первоначальное состояние экземпляра типа. Имя этого метода совпадает с именем типа. Возвращаемое значение конструктора указывать не нужно. Конструкторы могут принимать параметры. У типа может быть несколько конструкторов. Если в классе не определить конструктор то будет автоматически создан конструктор по умолчанию без параметров. Можно считать что в этом конструкторе все поля типа значений будут заданы нулями а все поля ссылочного типа будут заданы null. Если в структуре не определить конструктор то ничего не произойдёт. Более того типы значений вообще не могут иметь конструктор без параметров. Конструктор экземпляра вызывается при создании экземпляра, после выделения памяти. Компилятор C# автоматически генерируют код для вызова конструктора базового типа. 28 Объектно-ориентированные технологии 14. 11. 2008
Конструктор по умолчанию public class Some. Type { } public class Some. Type { public Some. Type() { } } 29 Объектно-ориентированные технологии 14. 11. 2008
Инициализация полей public class Some. Type { int x =10; double y = 1. 5; string s = "Привет Мир!"; public Some. Type(int x) { this. x =x; } } public class Some. Type { int x; double y; string s; public Some. Type(int x) { int x = 10; double = 1. 5; string = " Привет Мир!"; this. x =x; } } 30 Объектно-ориентированные технологии 14. 11. 2008
Конструкторы типов или статические конструкторы задают первоначальное состояние типа. Они могут быть и у ссылочных типов и у типов значений. У типа не может быть более одного конструктора типа. Конструкторы типов не могут иметь параметров. Они должны быть private, но объявлять их private не нужно, компилятор сделает это автоматически. Объявление конструкторов типов происходит также как и конструкторов экземпляра за исключением того что их нужно объявить static. Конструктор типа вызовется до первого обращения к одному из статических полей и до создания первого экземпляра типа. Если конструктор типа сгенерирует исключение тип использовать будет нельзя. 31 Объектно-ориентированные технологии 14. 11. 2008
Инициализация статических полей public class Some. Type { static int x =10; static double y = 1. 5; static string s = "Привет Мир!"; static Some. Type() { x = 5; } } public class Some. Type { static int x; static double y; static string s; static Some. Type() { x = 10; y = 1. 5; s = " Привет Мир!"; x = 5; } } 32 Объектно-ориентированные технологии 14. 11. 2008
Перегрузка операторов 33 Объектно-ориентированные технологии 14. 11. 2008
Перегрузка операторов Перегрузка оператора это метод который определяет что происходит с объектом когда к нему применяется оператор. Такой метод называется операторным методом. Для унарных операторов тип параметра операторного метода должен совпадать с типом для которого оператор перегружается. Для бинарных операторов тип хотя бы одного из параметров операторного метода должен совпадать с типом для которого оператор перегружается. 34 Объектно-ориентированные технологии 14. 11. 2008
Перегрузка арифметических операторов public class Point { private double x, y; public Point(double xpos, double ypos) { x=xpos; y=ypos; } public override String To. String() { return String. Format("({0}, {1})", x, y); } public static Point operator + (Point p 1, Point p 2) { return new Point(p 1. x + p 2. x, p 1. y + p 2. y); } public static Point operator - (Point p 1, Point p 2) { return new Point(p 1. x - p 2. x, p 1. y - p 2. y); }. . . } 35 Объектно-ориентированные технологии 14. 11. 2008
Перегрузка арифметических операторов static void Main() { Point point 1 = Point(1. 5, 2. 5); Point point 2 = Point(-2. 5, 4. 5); } 36 Console. Write. Line("Сумма {0} и {1} равна: {2}", point 1, point 2, point 1 + point 2); Console. Write. Line("Разность {0} и {1} равна: {2}", point 1, point 2, point 1 - point 2); Объектно-ориентированные технологии 14. 11. 2008
Операторы приведения 37 Объектно-ориентированные технологии 14. 11. 2008
Операторы приведения Оператор приведения это метод который определяет как преобразовать объект одного типа к объекту другого типа. Оператор приведения может быть явным или неявным. Неявный оператор используется для неявного приведения типа. Явный оператор используется для явного приведения типа. 38 Объектно-ориентированные технологии 14. 11. 2008
Операторы приведения public class Point {. . . public static implicit operator Point(int x) { return new Point(x, x); } } public static explicit operator int(Point p) { return p. x; } static void Main() { Point p = 5; int x = (int) p; } 39 Объектно-ориентированные технологии 14. 11. 2008
Переменное количество аргументов 40 Объектно-ориентированные технологии 14. 11. 2008
Переменное количество аргументов Иногда бывает удобно чтобы метод принимал переменное количество аргументов. Это несложно реализовать. Можно определить метод который принимает в качестве единственного параметра массив. Для вызова метода с некоторым количеством аргументов можно собрать все эти аргументы в массив и передать этот массив методу в качестве единственного параметра. Такой подход можно легко усовершенствовать чтобы получить метод который принимает переменное количество аргументов разных типов. В этом случае в качестве параметра метод должен принимать массив переменных общего для всех возможных аргументов базового типа. Вместо того чтобы создавать массив вручную, помещать в него аргументы и передавать массив методу в качестве параметра можно получить туже самую функциональность с помощью модификатора params. 41 Объектно-ориентированные технологии 14. 11. 2008
Переменное количество аргументов static int Sum(int[] values) { int sum = 0; for(int i=0; i < values. Length; i++) sum += values[i]; return sum; } static void Main() { Console. Write. Line(Sum(new int[]{1, 2, 3, 4, 5})); } 42 Объектно-ориентированные технологии 14. 11. 2008
Переменное количество параметров static int Sum(params int[] values) { int sum = 0; for(int i=0; i < values. Length; i++) sum += values[i]; return sum; } static void Main() { Console. Write. Line(Sum(1, 2, 3, 4, 5)); } 43 Объектно-ориентированные технологии 14. 11. 2008
Параметры разных типов static void Display(params object[] values) { for(int i=0; i < values. Length; i++) Console. Write. Line(values[i]); } static void Main() { Display("Привет Мир!", 25, 3. 5); } 44 Объектно-ориентированные технологии 14. 11. 2008
3_Tipy.pptx