1 / 53

Въведение в C#

Програмиране за .NET Framework. http:// www.nakov.com / dotnet /. Въведение в C#. Светлин Наков. Национална академия по разработка на софтуер. academy.devbg.org. Необходими знания. Добро познаване на поне един език за програмиране от високо ниво C C++ C# Java Pascal/Delphi Perl

adriel
Download Presentation

Въведение в C#

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Програмиране за .NET Framework http://www.nakov.com/dotnet/ Въведение в C# Светлин Наков Национална академия по разработка на софтуер academy.devbg.org

  2. Необходими знания • Добро познаване на поне един език за програмиране от високо ниво • C • C++ • C# • Java • Pascal/Delphi • Perl • Python • Базови познания за архитектурата на .NET Framework

  3. Съдържание (1) • Какво е C# • Принципи при дизайна на езика • Нашата първа програма на C# • Типове данни в C# • Примитивни типове данни • Изброен тип • Декларации • Изрази (expressions) • Програмни конструкции (statements)

  4. Съдържание (2) • Елементарни програмни конструкции • Съставни конструкции • Конструкции за управление – условни конструкции, конструкции за цикъл, конструкции за преход • Специални конструкции • Коментари и XML документация • Вход и изход от конзолата • Упражнения

  5. Какво е C# • Съвременен обектно-ориентиран език за програмиране с общо предназначение • Заимства много от C++, Java и Delphi • Наследява: • базовия синтаксис на C/C++ и Java • леснотата за използване на Java • мощността на C++ (предефинирани оператори) • силните страни на Delphi (свойства, индексатори, компонентна ориентираност) • Въвежда някои нови концепции: • типове по стойност и типове по референция • делегати и събития • атрибути • XML документация

  6. Принципи при дизайна на C# • Създаден от екипа на Anders Hejlsberg, архитектът на Delphi • Насочен към компонентно-ориентиранo програмиране • Компоненти, свойства, събития • XML-базирана документация • Всичко е събрано на едно място – без header файлове, без IDL и други файлове • Всички данни са обекти, дори примитивните типове • 5.ToString()е валидно извикване • Примитивните типове автоматично се опаковат и разопаковат

  7. Принципи при дизайна на C# • Сигурност и надеждност на кода • Силна типизираност и типова безопасност • Няма неправилна работа с указателите и с паметта • Няма излизане от границите на масивите • Няма неинициализирани променливи • Безопасност на аритметичните операции • Експлицитно задаване на виртуални методи и припокриване на метод • Автоматично управление на паметтаи ресурсите • Широко използване на изключения • Вградени механизми за сигурност на кода (code access security и role-based security) • Стандартизиран от ECMA и ISO

  8. Програмите на C# • Представляват съвкупност от дефиниции на класове, структури и други типове • Някой от класовете съдържа метод Main() – входна точка за програмата • Приложенията могат да се състоят от много файлове • В един файл може да има няколко класове, структури и други типове • Класовете логически се разполагат в пространства от имена (namespaces) • Един namespace може да е разположен в няколко файла

  9. HelloCSharp.cs using System; class HelloCSharp { static void Main() { Console.WriteLine("Hello, C#"); } } Нашата първа програма на C# • Много прилича на Java • Много прилича на C++ • Не е нито едното от двете

  10. Как работи програмата? • Директивата using System; • като #includeв C++ • като importв Java • като usesв Delphi • Декларацията на клас • ключова дума class • Методът static void Main() • входна точка на програмата • когато завърши, завършва и програмата • Класът System.Console • осигурява средства за вход и изход от конзолата

  11. Демонстрация #1 • Компилиране от командния ред • Стартиране от командния ред • Резултат csc HelloCSharp.cs HelloCSharp.exe Hello, C#

  12. Демонстрация #2 • Създаване на проект, компилиране и стартиране от Visual Studio.NET [Ctrl+F5]

  13. Запазени думи в C#

  14. Типове данни в C# • Типовете данни биват два вида • Типове по стойност (value types) • директно съдържат своята стойност • съхраняват се в стека • предават се по стойност • Типове по референция (reference types) • представляват силно-типизирани указатели към стойност в динамичната памет • предават се по референция (указател) • унищожават се от garbage collector-а • Типовете биват oще • примитивни (вградени, built-in) типове • дефинирани от потребителя

  15. Типове данни в C# • Типове по стойност (value types) • Примитивниint i; • Изброени enum State { Off, On } • Структури struct Point { int x, y; } • Типове по референция (reference types) • Класовеclass Foo: Bar, IFoo {...} • Интерфейсиinterface IFoo: IBar {...} • Масиви string[] a = newstring[5]; • Делегати delegate void Empty(); • На всички типове в C# съответстват типове от CTS на .NET Framework • Например int = System.Int32

  16. Примитивни типове • Примитивните типове данни в C# (built-in data types) биват • Типове по стойност • като примитивните типове в C и C++ • byte, sbyte, int, uint, long, ulong – цели числа • float, double, decimal – реални числа • char – Unicode символи • bool – булев тип (trueили false) • Типове по референция • string – неизменима последователност от Unicode символи • Специален тип object – всички типове го наследяват

  17. Преобразуване на типовете • Два типа преобразувания на примитивните типове • По подразбиране (implicit conversion) • позволява се, когато е безопасно • Например: int long, float  double, long  float, byte  short • Изрично (explicit conversion) • когато преобразуваме към по-малък типили типовете не са директно съвместими • Например long int, double  float, char  short, int  char, sbyte  uint • В checked режим при препълване се получава System.OverflowException

  18. Преобразуване на типовете byte b8 = 255; short sh16 = b8;// implicit conversion int i32 = sh16; // implicit conversion float f = i32; // implicit - possible loss of precision! double d = f; // implicit conversion checked { byte byte8 = (byte) sh16;// explicit conversion // OverflowException is possible! ushort ush16 = (ushort) sh16;// explicit conversion // OverflowException is possible if sh16 is negative! } unchecked { uint ui32 = 1234567890; sbyte sb8 = (sbyte) ui32; // explicit conversion // OverflowException is not thrown in unchecked mode }

  19. Изброени типове (enumerations) • Изброените типове в C# се състоят от множество именувани константи • Дефинират се със запазената дума enum. Например: • Използват се за задаване на една измежду няколко възможности • Вътрешно се представят с int, но може да се зададе и друг числов тип • Силно типизирани – не се превръщат в intосвен експлицитно enum Days {Sat, Sun, Mon, Tue, Wed, Thu,Fri};

  20. Изброени типове (enumerations) • Наследяват типа System.Enum • Могат да се използват като съвкупност от битови флаговечрез атрибута [Flags] [Flags] public enum FileAccess { Read = 1, Write = 2, Execute = 4, ReadWrite = Read | Write } //... Console.WriteLine( FileAccess.ReadWrite | FileAccess.Execute); // The result is: "ReadWrite, Execute"

  21. Идентификатори • Състоят се от последователности от букви, цифри и знак за подчертаване • Винаги започват с буква или подчертаване • Малките и главните букви се различават • Могат да съдържат Unicode символи • int алабала_портокала = 118; • bool \u1027\u11af = true; • Microsoft препоръчва се следната конвенция • PascalCase – имена на класове, namespace-и, структури, типове, методи, свойства, константи • camelCase – имена на променливи и параметри

  22. Декларации • Декларациите на променливи в C# могат са няколко вида (почти като в C++, Java и Delphi): • локални променливи (за даден блок) • int count; • член-променливи на типа • public static int mCounter; • могат да имат модификатори • константи • compile-time константи – декларират се като променливи със запазената дума const • runtime константи – декларират се като полета смодификатора readonly

  23. Константи • В C# има два вида константи: • Compile-time константи: • Декларират се със запазената дума const • Задължително се инициализират в момента на декларирането им и не могат да се променят след това • Реално не съществуват като променливи в програмата • По време на компилация се заместват със стойността им public const double PI = 3.1415926535897932; const string COMPANY_NAME = "Менте Софт";

  24. Константи • В C# има няколко вида константи: • Run-time константи • Декларират се със запазената дума readonly • Представляват полета на типа, които са само за четене • Инициализират се по време на изпълнение (в момента на деклариране или в конструктора на типа) • Не могат да се променят след като веднъж са инициализирани public readonly DateTime NOW = DateTime.Now;

  25. Оператори • Много близки до операторите в C++ и Java, със същите приоритети • Аритметични: +, -, *, /, %, ++, -- • Логически: &&, ||, !, ^, true, false • Побитови операции: &, |, ^, ~, <<, >> • За слепване на символни низове: + • За сравнение: ==, !=, <, >, <=, >= • За присвояване: =, +=, -=, *=, /=, %=, &=, |=, ^=, <<=, >>= • За работа с типове: as, is, sizeof, typeof • Други: ., [], (), ?:, new,checked, unchecked,unsafe

  26. Изрази (expressions) • Изразите, които се изчисляват до някаква стойност се наричат expressions • Имат синтаксиса на C++ и Java • Например: a = b = c = 20; // израз със стойност 20 (а+5)*(32-a)%b// израз с числова стойност "ала" + "бала"// символен израз (string) Math.Cos(Math.PI/x)// израз среална стойност typeof(obj)// израз от тип System.Type (int) arr[idx1][idx2]// израз от типint new Student() // израз от тип Student (currentValue <= MAX_VALUE)// булев израз

  27. Конструкции (statements) • Програмните конструкции (statements) имат синтаксиса на C++ и Java • Биват няколко вида: • Елементарни програмни конструкции • Съставни конструкции – { … } • Програмни конструкции за управление • Условни конструкции • Конструкции за повторение и цикъл • Конструкции за преход • За управление на изключенията • Специални конструкции (напр. lock)

  28. Конструкции (statements) • Елементарни програмни конструкции • Най-простите елементи на програмата. Примери: • Съставни конструкции • Състоят се от няколко други конструкции, оградени в блок. Например: sum =(a+b)/2; // присвояване (<променлива> = <израз>) PrintReport(report);// извикване на метод student = new Student("Светлин Наков", 3, 42688); // създаване на обект { Report report = GenerateReport(period); report.Print(); }

  29. Конструкции за управление • Условни конструкции (conditional statements) • if и if-else if (orderItem.Ammount > ammountInStock) { MessageBox.Show("Not in stock!", "error"); } if (Valid(order)) { ProcessOrder(order); } else { MessageBox.Show("Invalid order!", "error"); }

  30. Конструкции за управление • Условни конструкции (conditional statements) • switchиcase • позволено е използване по stringи enum switch (characterCase) { case CharacterCasing.Lower: text = text.ToLower(); break; case CharacterCasing.Upper: text = text.ToUpper(); break; default: MessageBox.Show("Invalid case!", "error"); break; }

  31. Конструкции за управление • Конструкции за повторение (iteration statements) • for-цикъл • while-цикъл // Отпечатваме числата от 1 до 100 и техните квадрати for (int i=1; i<=100; i++) { int i2 = i*i; Console.WriteLine(i + "*" + i+ " = " +i2); } // Изчисляваме result = a^b result = 1; while (b > 0) { result = result * a; b--; }

  32. Конструкции за управление • Конструкции за повторение (iteration statements) • цикъл do-while • цикъл foreach – за обработка на колекции // Четем символи до достигане на край на ред do { ch = ReadNextCharacter(stream); } while (ch != '\n'); string[] names = GetNames(); // Отпечатваме всички елементи на масива foreach (string name in names) { Console.WriteLine(name); }

  33. Конструкции за преход • Конструкции за преход • break, continue – използват се в цикли • goto – безусловен преход • return – за връщане от метод // Търсим позицията на даден елемент targetв масиваa[] int position = -1; for (int i=0; i<a.length; i++) { if (a[i] == target) { position = i; break; } } return position;

  34. Други конструкции • Конструкции за управление на изключенията • throw – предизвикване на изключение • try-catch – прихващане на изключение • try-finally – сигурно изпълнение на завършваща секция • try-catch-finally – прихващане на изключение със завършваща секция • Специални конструкции • lock – синхронизирано изпълнение • checked, unchecked – контрол на аритметичните препълвания • fixed – фиксиране на местоположението в паметта при работа с неуправляван код

  35. Digits.cs using System; public class Digits { static void Main() { for (int d1=1; d1<=9; d1++) for (int d2=0; d2<=9; d2++) { int d3 = 25 - d1 - d2; if ((d3 >= 0) && (d3 <= 9)) { int n = d1*100 + d2*10 + d3; Console.WriteLine(n); } } } } Демонстрация #3 • Намиране на всички трицифрени числа, чиято сума от цифрите е 25

  36. Демонстрация #4 • Дебъгерът на VS.NET

  37. Демонстрация #5 • Инструментът ILDASM ILDASM Digits.exe

  38. Коментарив програмата • Коментарите биват няколко вида • Коментар за част от програмен ред • Блоков коментар Order orders[]; //Съдържа всички поръчки на потребителя /* Изтриваме всички поръчки, за които някой артикул не еналичен в необходимото количество. Изтриване реално не се извършва, а само се променя статусана Deleted */ foreach (Order order in customer.Оrders) { if (!AllItemsInStock(order)) { order.Status = OrderStatus.Deleted; } }

  39. XML документация • Представлява съвкупност от коментари, започващи с /// • Може да съдържа различни XML тагове • Като идея прилича на JavaDoc в Java • Значително улеснява поддръжката – документацията е част от кода, а не стои във външен файл • C# компилаторът може да извлича XML документацията като XML файлза по-нататъшна обработка

  40. XML документация – пример • /// <summary> • /// The main entry point for the application. • /// </summary> • /// <param name="args">The command line arguments</param> • static void Main(string[] args) • { • // ... • } • /// <summary>Calculates the square of a number</summary> • /// <param name="num">The number to calculate</param> • /// <returns>The calculated square</returns> • /// <exception cref="OverflowException">Thrown when the • /// result is too big to be stored in an int</exception> • /// <seealso cref="System.Int32" /> • public static int square(int num) • { • // ... • }

  41. XML документация – тагове <summary>…</summary>– кратко описание за какво се отнася даден тип, метод, свойство и т.н. Visual Studio показва това описание при задействане на IntelliSense <remarks>…</remarks>– подробно описание на даден тип, метод, свойство и т.н. Visual Studio показва това описание в областта Object Browser <param name="…">…</param>– описание на един от параметрите на даден метод <returns>…</returns>– описание на връщаната от даден метод стойност <exception cref="…">…</exception>– описание на изключение, което може да възникне в даден метод <seealso cref="…"/>– препратка към информация, свързана с текущото описание <value>…</value>– описание на свойство (property)

  42. Демонстрация #6 • Извличане на XML документация от C# код • Генериране на HTML документация от Visual Studio .NET csc MainClass.cs /doc:MainClassComments.xml

  43. Директиви на препроцесора • За форматиране на кода • #region, #endregion – ограждат блок от кода, който се "свива" от редактора на Visual Studio • Директиви за условна компилация • #if, #else, #elif, #endif – задават границите на блоковете за условна компилацияи съответните условия (знаци) за компилиране • #define, #undef – дефинират знаци за условна компилация • За контрол над компилатора • #warning, #error – задават предупреждения и грешки по време на компилация

  44. Вход и изход от конзолата • Използват се стандартни класове от BCL • Вход от конзолата • Console.ReadLine() – чете цял символен реди връща string • Console.Read() – чете единичен символ и връща char • Изход към конзолата • Console.Write(…) – печата на конзолата подадените като параметри данни (приема string, int, float, double,…) • приема параметрични форматиращи низове • Console.WriteLine(…) – работи като Conlsole.Write(), но преминава на нов ред Console.WriteLine("Днес е {0:dd.MM.yyyy} г.", DateTime.Now);

  45. Вход и изход от конзолата – пример int a = Int32.Parse(Console.ReadLine()); int b = Int32.Parse(Console.ReadLine()); Console.WriteLine("{0} + {1} = {2}", a, b, a+b); // (въвеждаме съответно 3 и 2 като вход от конзолата) // 2 + 3 = 5 Console.WriteLine( "Днес е {0:dd.MM.yyyy} г.",DateTime.Now); // Днес е 13.05.2004 г. Console.WriteLine("Цена: {0,12:C}", 27); // Цена: 27,00 лв // (точният формат зависи от текущите езикови настройки) String name = "Наков"; Console.WriteLine("Хей, {0}, часът е {1:HH:mm}!", name,DateTime.Now); // Хей, Наков, часът е 16:43!

  46. Демонстрация #7 • Документацията на .NET Framework • Търсене на помощна информация за класа Console.WriteLine() (натискаме F1 във Visual Studio .NET) • Намиране на темата "composite formatting" в MSDN

  47. Въведение в C# Въпроси?

  48. Упражнения • Съставете програма на C#, която въвежда от конзолата име на студент и го поздравявав стил "Здравей, <име>!". • Съставете програма на C#, която въвежда коефициентите на квадратно уравнение и пресмята реалните му корени. • Напишете програма, която намира всички символни низове, които се състоят от точно 5 малки латински букви и са симетрични спрямо средата си. • Проследете работата на програмата от задача 3 с debugger-а на Visual Studio .NET. • Променете програмата от задача 3, така че да намира само тези низове, които съдържат четен брой гласни букви. Колко са тези низове?

  49. Упражнения • Добавете XML документация в програмата от задача 5 и генерирайте HTML документация от Visual Studio .NET. • Напишете програма, която намира сумарната стойност на група фактури. Програмата трябва да въвежда последователно от конзолата сумите на фактурите (реални числа със знак) докато стигне до празен ред. Сумарната стойност на фактурите трябва да се отпечата в 10-символно поле, дясно подравнена, с точност 2 знака след десетичната запетая (потърсете в документацията подходящ форматиращ стринг). • Напишете програма, която прочита прост числен израз, състоящ се от реални числа, свързани с операциите "+" и "-" и изчислява стойността му.

More Related