Тема № 3

52
Тема №3 Базові можливості C#

Upload: winifred-cohen

Post on 01-Jan-2016

23 views

Category:

Documents


2 download

DESCRIPTION

Тема № 3. Базові можливості C#. Загальний огляд системи типів. Всі типи поділяються на дві категорії: Value Type та Reference Type . На вершині ієрархії – клас System.Object, тобто всі типи є його нащадками - прямо чи опосередковано. Ряд методів, в т.ч. GetType(), ToString(), … - PowerPoint PPT Presentation

TRANSCRIPT

Тема №3

Базові можливості C#

Загальний огляд системи типів

Всі типи поділяються на дві категорії: Value Type та Reference Type.

На вершині ієрархії – клас System.Object, тобто всі типи є його нащадками - прямо чи опосередковано. Ряд методів, в т.ч. GetType(), ToString(), …

Повні імена та псевдоніми. Наприклад, char та System.Char.

Це ж стосується і таких типів, як System.String та System.Object, хоч вони і Reference Type.

Елементарні типи (?) – для яких є прості імена, і які підтримуються компілятором напряму.

Змінні категорії Reference Type ведуть себе подібно до вказівникових типів.

Чи є в C# вказівники?

Приклад unsafe-коду

unsafe static void Main(string[] args)

{

int i = 12;

int* p = &i;

(*p)++;

Console.WriteLine(i); //13

Console.ReadLine();

}

Value Types

Вбудовані типи. Типи, які визначаються користувачем:

перелічення (enum) та структури (struct).

Отримання інформації про типи

Оператор is – перевірка того, чи має певний об’єкт той чи інший тип.

Reflection – отримання детальної інформації про тип. Центральне місце – клас System.Type, екземпляр якого можна отримати за допомогою методу GetType() (це метод класу Object).

Оператор typeof(тип) – отримання екземпляра класу Type для заданого типу.

Приклад

var iv = new int(); // Можна поводитися як з класами iv = 2; Console.WriteLine(iv); // Simple Reflection if (iv is object) Console.WriteLine("Так, це об'єкт"); if (iv is string) Console.WriteLine("Так, це рядок"); else Console.WriteLine("Ви чого, дядьку - це ж не рядок"); Type ti = iv.GetType(); Console.WriteLine(ti); Console.WriteLine(ti.Name); Type tit = typeof(int); Console.WriteLine(tit.BaseType); // ValueType

Основні типи

sbyte System.SByte 1 байт; зі знаком

byte System. Byte 1 байт; без знаку

short System.Int16 2 байти; зі знаком

ushort System.UInt16 2 байти; без знаку

int System.Int32 4 байти; зі знаком

uint System.UInt32 4 байти; без знаку

long System.Int64 8 байтів; зі знаком

ulong System.UInt64 8 байтів; без знаку

char System.Char символ Unicode; 2 байти

Основні типи: продовження

float System.Single 32-розрядні дійсні

double System.Double 64-розрядні дійсні

bool System.Boolean Логічні значення

decimal System.Decimal 128-розр. дійсне підвищеної точності

object System.Object

string System.String

Деякі особливості літералів

16-кові – на початку 0х. Беззнакові – в кінці U. Decimal – в кінці М. Довгі цілі – в кінці L. Символьні літерали – в одинарних

лапках, рядки – в подвійних. Символьні літерали можна задавати

Unicode-кодом, напр., ‘\u0041’. Годиться і ‘\x0041’.

Перетворення типів

“Класичне” перетворення – буде наведений приклад.

Оператор as – “безпечне” перетворення. Існують правила неявного перетворення. Перетворення між bool та int немає!

Правила просування типів у виразах Якщо один операнд є decimal, то і інший піднімається до

decimal (але несумісно з float та double). Інакше: Якщо один операнд є double, то і інший піднімається до

double. Інакше: Якщо один операнд є float, то і інший піднімається до float.

Інакше: Якщо один операнд є ulong, то і інший піднімається до ulong

( несумісно зі знаковими цілочисельними типами). Інакше: Якщо один операнд є long, то і інший піднімається до long.

Інакше: Якщо один операнд є uint, а інший – sbyte, short, int то і

обидва перетворюються на long. Інакше: Якщо один операнд є uint, то і інший піднімається до uint. Інакше: обидва операнди перетворюються на int

(правило integer promotion).

Перетворення типів – приклад №1

byte b1 = 2;

byte b2 = 3;

// byte br = b1 + b2; - помилка компіляції

byte br = (byte) (b1 + b2);

Перетворення типів – приклад №2

int i = 'A';

Console.WriteLine(i); // 65

char c = (char) 97;

Console.WriteLine(c); //a

Перетворення типів – приклад №3

char cc1 = 'd';

char cc2 = (char)1;

char cc = (char)(cc1 + cc2); //e

Змінні

Опис і використання – традиційні. Нове в C# 3.0 – можливість оголошення var. Для опису констант – модифікатор const. Є також модифікатор readonly. Для полів класів,

які можуть змінюватися лише в їх конструкторах. Змінні перед першим використанням повинні

бути проініціалізовані! Але елементи масивів і поля класів автоматично ініціалізуються значеннями за замовченням.

Область дії змінної – блок, але вона не може повторно визначатися в підблоках!!!

Так не можна

{

int ib = 5;

{

int ib = 6;

Console.WriteLine(ib);

}

}

Перетворення типів: очевидне-неймовірне

int i = 1;

long l = 1;

Console.WriteLine(i.Equals(l)); //False

Console.WriteLine(l.Equals(i)); //True

Nullable-типи і поглинання null - приклад

int? a = null;

int c;

c = a ?? 10; //10

a = 5;

c = a ?? 10; //5

Перелічувані типи - приклад

enum Auto { Slavuta, Ferrari, Mersedes, Lada, Moped }

Auto av = Auto.Slavuta;

Console.WriteLine(av);

Або:

Auto av = (Auto) 0; - сумісність з цілочисельними значеннями

Основні оператори

Common OperatorsCommon OperatorsCommon OperatorsCommon Operators

• Equality operators• Relational operators• Conditional operators• Increment operator• Decrement operator• Arithmetic operators• Assignment operators

ExampleExample

== !=

< > <= >= is

&& || ?:

++

- -

+ - * / %

= *= /= %= += -= <<=

>>= &= ^= |=

Основні інструкції C#

коментарі if while do foreach goto break continue switch return

Коментарі – три типи

// - однорядковий коментар /* - багаторядковий коментар /// - коментар для створення документації

(прохання познайомитись з цією можливістю самостійно)

Приклад if

//If statement

bool b = true;

int r;

if (b) { r = 1; }

else { r = 0; }

Console.WriteLine("b is {0} => r is {1}",b,r);

// ще раз про підстановки

Console.ReadLine();

Приклад while (цикл з передумовою)

int i = 0;

while (i < 10) { Console.Write(i+" "); i++; }

Приклад do (цикл з постумовою)

int k = 0;

do { Console.Write(k + " "); k++; } while (k < 10);

Приклад for

int[ ] M = { 1, 5, 9 };

int L = M.Length;

for (int l = 0; l < L; l++)

{

Console.Write(M[l] + " ");

}

Приклад foreach для масивів

//Foreach for arrays

foreach (int mm in M)

{

Console.Write(mm + " ");

}

Приклад LINQ (з 3.0)

var numbers = new int[ ] {1, 4, 9, 16, 25};

// Отримуємо парні числа, поділені навпіл:

var evens = from p in numbers

where (p %2) == 0

select p/2;

foreach (var v in evens) …

Приклад foreach для колекцій

List <int> numbers = new List <int>();

for (int ik = 0; ik < 10; ik++)

{

numbers.Add(ik);

}

foreach (int ikl in numbers)

{

Console.Write(ikl + " ");

}

Приклад foreach для рядків

//Foreach for strings

String S = "qwerty";

foreach (char c in S)

{

Console.Write(c + " ");

}

Jump - інструкції

Є оператор переходу goto. Інструкції break та continue – помітних

особливостей у порівнянні з С немає. return.

Приклад switch: для перелічуваних типівString Message;switch (av){ case Auto.Slavuta: Message =

"Крута тачка"; break; case Auto.Mersedes: Message =

"Навіщо Вам та колимага?"; break; default: Message = "Не розумію...";

break; }

Особливості switch

Заборонені “провали” (крім випадків пустих case-інструкцій).

Порядок case-розділів не має значення. Зокрема, default може бути де завгодно.

В case-розділах можуть використовуватися цілочисельні типи (включно з char та enum) і тип string.

Масиви

Вказівниковий тип. Оголошення int[ ] M створює лише

вказівник, а не сам масив; операція М1=М2 – це лише копіювання вказівників!

Базовий тип – Array. В ньому – корисні методи для копіювання (Copy), сортування (Sort), обернення масивів (Reverse), пошуку елемента в масиві (IndexOf) і т.п.

Довжина масиву – M.Length.

Три типи масивів

одновимірні масиви; “традиційні”, “прямокутні” масиви; “нерівні” масиви; масиви масивів.

Відмінність від прямокутних – навіть на рівні синтаксису.

Ініціалізація одновимірних масивів int[ ] M = new int[4]; Або: int[ ] M = { 1, 4, 9, 16};

Приклад ініціалізації прямокутних масивів

int R[ , ] = { {1,3,5}, {10,30,50}};

Приклад ініціалізації “нерівних” масивів

int [ ] [ ] R = new int[2][ ] {

new int[ ] {1,3,5},

new int[ ] {10,20}

};

Console.WriteLine (R[0][1])

(R[0,1] не проходить).

Виключення

Типовий механізм для обробки неординарних, виняткових ситуацій.

try – catch – finally.

Простий приклад виключення

try { S = Console.ReadLine(); int i = int.Parse(S); Console.WriteLine("Result is " + i * 2); } catch (FormatException e)

{ Console.WriteLine(e.Message); //Або StackTrace} catch (Exception) { Console.WriteLine("Error"); } finally { Console.WriteLine("Thank you");

}

Виключення: на що слід звернути увагу На вершині ієрархії – клас System.Exception. Може бути декілька блоків catch. Спочатку слід перехоплювати менш загальні

виключення, а потім більш загальні – інакше помилка компіляції.

Для catch може бути різний синтаксис – catch(Ex-n e) або catch(Ex-n). Можна і просто catch – для найбільш загального виключення.

Блоки try можуть бути вкладеними. Генерація виключення – throw new Exception(); Можна створювати власні виключення.

Прохання ознайомитися з цією можливістю самостійно.

checked та unchecked

Секція checked - додатковий контроль за виключеннями переповнення, які за замовченням не генеруються.

unchecked (діє за замовченням) – відключення такого контролю; типове використання – в області дії checked.

Приклад використання checked

byte S; try { checked { S = 250; S += 10; Console.WriteLine(S); // без checked було б 4 } } catch (Exception e) { Console.WriteLine(e.Message); }

Ще одна форма

checked/unchecked (expression)

Наприклад:

result = checked ((byte) (a+b));

Деякі особливості методів

Механізм передачі параметрів. Змінна кількість параметрів.

Передача параметрів

Способи передачі параметрів - in, ref, out. in (за замовченням) – передача за значенням; для

Reference Type – за значенням передається посилання на об’єкт.

Модифікатор ref (і в оголошенні, і при виклику) – відповідний параметр передається за посиланням. Метод отримує значення цього параметра.

Модифікатор out – передача за посиланням; метод значення не отримує. Типове використання – для отримання результуючих змінних; зокрема, якщо ці змінні до виклику ще не ініціалізовані.

Приклад 1 – знаходження суми

static void Metod(int a, int b, out int S) { S = a + b; } static void Main(string[] args) { int a = 5; int b = 10; int Q; Metod(a, b, out Q); Console.WriteLine(Q); Console.ReadLine(); }

Приклад 2 – обмін посилань

Метод, який міняє між собою два посилання на екземпляри певного класу (крім string або value type), які передаються цьому методу як параметри. Для передачі параметрів слід використовувати модифікатор ref.

Змінна кількість параметрів - прикладstatic int Sum(params int[ ] pars) { int M = 0; foreach (int q in pars) { M += q; } return M; } static void Main(string[ ] args) { Console.WriteLine(Sum(5, 7,2)); Console.ReadLine(); }

Рядки

Клас System.String (або string). Рядки є незмінюваними (як і в Java). Змінювані – клас

System.Text.StringBuilder. Довжина рядка – властивість Length. Важливі операції: конкатенація (+), індексація ([ ]),

порівняння (==). Символ @. Багато методів: пошук символа (IndexOf), виділення

підрядка (Substring) і т.п. Методи Split та Join – розщеплення та з’єднання рядка. Засоби форматування рядків (метод String.Format). Регулярні вирази (System.Text.RegularExpressions).

Приклад використання Split та JoinConsole.WriteLine("Enter your string");String S = Console.ReadLine();char[ ] delim = {' ', '-', ',', '.'}; String[ ] arr = S.Split(delim,

System.StringSplitOptions.RemoveEmptyEntries);

for (int i=0; i<arr.Length; i++) { arr[i]=arr[i].ToUpper(); } String Res = String.Join(":", arr);

Регулярні вирази: перевірка коректності електронної адресиString ln = Console.ReadLine();

Regex reg = new Regex(@"\w+@\w+\.\w+");

if (reg.IsMatch(ln))

{

Console.WriteLine("Correct mail");

}

else

{

Console.WriteLine("Incorrect mail");

}