5. Программирование на языке C#.ppt
- Количество слайдов: 37
Программирование на языке C# Бестужев Никита Евгеньевич Преподаватель
Содержание лекции 1. 2. 3. 4. 5. 6. Знакомство с типом класса C# Понятие конструктора Роль ключевого слова this Понятие ключевого слова static Файловый ввод-вывод Работа с потоками 2
Знакомство с типом класса C# Пример: class Car { // 'Состояние' объекта Саr. public string pet. Name; public int curr. Speed; } 3
Знакомство с типом класса C# Определение методов: … // Функциональность Car. public void Print. State() { Console. Write. Line ( «{0} is going {1} MPH. » , pet. Name, curr. Speed); } public void Speed. Up(int delta) { curr. Speed += delta; } 4
Знакомство с типом класса C# Размещение объектов с помощью ключевого слова new: static void Main(string[] args) { Car my. Car = new Car(); my. Car. pet. Name = "Fred"; } 5
Понятие конструктора Конструктор по умолчанию: class Car { public string pet. Name; public int curr. Speed; public Car () { pet. Name = "Chuck"; curr. Speed = 10; } } 6
Понятие конструктора Специальный конструктор: // Позволяет вызывающему коду установить полное состояние Саr public Car(string pn, int cs) { pet. Name = pn; curr. Speed = cs; } … // Создать объект Car no имени Daisy со скоростью 75 миль в час Car daisy = new Car ("Daisy", 75); 7
Роль ключевого слово this class Motorcycle { public int driverlntensity; public string name; public void Set. Driver. Name(string name) { name = name; } } Для разрешения неоднозначности: public void Set. Driver. Name (string name) { this. name = name; } 8
Понятие ключевого слово static // Ошибка! Write. Line() не является методом уровня объекта Console с = new Console (); с. Write. Line("I can't be printed. . . "); // Правильно! Write. Line() - статический метод. Console. Write. Line("Thanks. . . "); 9
Файловый ввод-вывод Пространство имен System. IO: Directory. Info File. Info Directory File 10
Файловый ввод-вывод Directory. Info: // Привязаться к несуществующему каталогу, затем создать его. Directory. Info dir = new Directory. Info (@"C: My. CodeTesting"); dir. Create(); 11
Файловый ввод-вывод Перечисление файлов с помощью Directory. Info: Directory. Info dir = new Directory. Info(@"C: WindowsWebWallpaper"); // Получить все файлы с расширением *. jpg. File. Info[] image. Files = dir. Get. Files("*. jpg“, Search. Option. All. Directones); // Вывести информацию о каждом файле. foreach (File. Info f in image. Files) { Console. Write. Line("File name: {0}", f. Name); // имя Console. Write. Line("File size: {0}", f. Length); // размер Console. Write. Line("Creation: {0}", f. Creation. Time); // время создания } 12
Файловый ввод-вывод Directory: // Перечислить все дисковые устройства данного компьютера. string [] drives = Directory. Get. Logical. Drives(); // Удалить то, что было ранее создано. Directory. Delete(@"C: My. Folder"); 13
Файловый ввод-вывод Drive. Info: // Получить информацию обо всех приводах. Drive. Info[] my. Drives = Drive. Info. Get. Drives(); // Напечатать состояние приводов. foreach(Drive. Info d in my. Drives) { Console. Write. Line("Name: {0}", d. Name); // Имя Console. Write. Line("Type: {0}", d. Drive. Type); //Тип } 14
Файловый ввод-вывод File. Info: static void Main(string[] args) { // Создать новый файл на диске С: File. Info f = new File. Info(@"C: Test. dat"); File. Stream fs = f. Create(); // Использовать объект File. Stream. . . // Закрыть файловый поток. fs. Close(); } 15
Файловый ввод-вывод File. Info: static void Main(string[] args) { // Создать новый файл через File. Info. Open(); File. Info f 2 = new File. Info(@"C: Test 2. dat") ; using(File. Stream fs 2 = f 2. Open(File. Mode. Open. Or. Create, File. Access. Read. Write, File. Share. None) ) { // Использовать объект File. Stream. . . } } 16
Файловый ввод-вывод File: //Получить объект File. Stream через File. Create (). using(File. Stream fs = File. Create(@"C: Test. dat")) {… } // Получить объект File. Stream через File. Open(). using(File. Stream fs 2 = File. Open(@MC: Test 2. dat", File. Mode. Open. Or. Create, File. Access. Read. Write, File. Share. None)) {… } 17
Файловый ввод-вывод Класс Stream: Содержит набор членов, которые обеспечивают поддержку синхронного и асинхронного взаимодействия с хранилищем (файл, область памяти) Предопределенные классы Stream. Reader (возможность читать символьный поток) и Stream. Writer (возможность записывать текстовые данные в символьный поток) 18
Файловый ввод-вывод Запись в текстовый файл: // Получить Stream. Writer и записать строковые данные. using (Stream. Writer writer = File. Create. Text ("reminders. txt")) { writer. Write. Line("Don't forget Mother's Day this year. . . "); writer. Write. Line("Don't forget Father's Day this year. . . "); writer. Write. Line("Don't forget these numbers: "); for(int i = 0; i < 10; i++) writer. Write (i + " "); // Вставить новую строку. writer. Write(writer. New. Line); } 19
Файловый ввод-вывод Чтение из текстового файла: // Прочитать данные из файла. using(Stream. Reader sr = File. Open. Text("reminders. txt")) { string input = null; while ((input = sr. Read. Line()) != null) { Console. Write. Line(input); } } 20
Работа с потоками Класс System. Threading. Thread: 21
Работа с потоками Класс System. Threading. Thread: 22
Работа с потоками Получение статистики о текущем потоке: static void Main(string [ ] args) { Thread primary. Thread = Thread. Current. Thread; primary. Thread. Name = "The. Primary. Thread"; Console. Write. Line("Thread Name: {0}", primary. Thread. Name); //имя потока Console. Write. Line("Has thread started? : {0}“, primary. Thread. Is. Alive); //запущен ли поток Console. Write. Line("Priority Level: {0}", primary. Thread. Priority); //приоритет потока Console. Write. Line("Thread State: {0}", primary. Thread. State); //состояние потока Console. Read. Line(); } 23
Работа с потоками Получение статистики о текущем потоке (вывод): Thread Name: The. Primary. Thread Has thread started? : True Priority Level: Normal Thread State: Running 24
Работа с потоками Свойство Priority: public enum Thread. Priority { Lowest, Below. Normal, // Значение по умолчанию. Above. Normal, Highest } 25
Работа с потоками Программное создание вторичных потоков: 1. 2. 3. 4. 5. Создать метод, который будет точкой входа для нового потока. Создать новый делегат Parametrized. Thread. Start (или Thread. Start), передав конструктору адрес метода, определенного на шаге 1. Создать объект Thread, передав в качестве аргумента конструктора Parametrized. Thread. Start/Thread. Start. Установить начальные характеристики потока (имя, приоритет и т. п. ). Вызвать метод Thread. Start(). Это запустит поток на методе, который указан делегатом, созданным на шаге 2, как только это будет возможно. 26
Работа с потоками Работа с делегатом Thread. Start: public class Printer { public void Print. Numbers() { Console. Write. Line("-> {0} is executing Print. Numbers()", Thread. Current. Thread. Name; Console. Write("Your numbers: "); for(int i = 0; i < 10; i++) { Console. Write ("{0}, ", i) ; Thread. Sleep(1000); } Console. Write. Line (); } } 27
Работа с потоками Работа с делегатом Thread. Start: // Создать поток. Thread background. Thread = new Thread(new Thread. Start(p. Print. Numbers)); background. Thread. Name = "Secondary"; background. Thread. Start(); 28
Работа с потоками Потоки переднего плана и фоновые потоки: Потоки переднего плана (foreground threads) обеспечивают предохранение текущего приложения от завершения. Среда CLR не остановит приложение (что означает выгрузку текущего домена приложения) до тех пор, пока не будут завершены все фоновые потоки. Фоновые потоки (background threads), иногда называемые потоками-демонами, воспринимаются средой CLR как расширяемые пути выполнения, которые в любой момент времени могут игнорироваться (даже если они в текущее время заняты выполнением некоторой части работы). Таким образом, если все потоки переднего плана прекращаются, то все фоновые потоки автоматически уничтожаются при выгрузке домена приложения. 29
Работа с потоками Пример проблемы, связанной с параллелизмом: public class Printer { public void Print. Numbers () { for (int i = 0; i < 10; i++) { Random r = new Random(); Thread. Sleep(1000 * r. Next(5)); Console. Write("{0}, ", i); } Console. Write. Line (); } } 30
Работа с потоками Пример проблемы, связанной с параллелизмом: class Program { static void Main(string[] args) { Printer p = new Printer(); Thread[] threads = new Thread[10]; for (int i = 0; i < 10; i++) { threads[i] = new Thread(new Thread. Start(p. Print. Numbers)); threads[i]. Name = string. Format("Worker thread #{0}", i) ; } foreach (Thread t in threads) t. Start() ; Console. Read. Line(); } } 31
Работа с потоками Пример проблемы, связанной с параллелизмом: -> Worker thread #1 is executing Print. Numbers () Your numbers: -> Worker thread #0 is executing Print. Numbers() -> Worker thread #2 is executing Print. Numbers() Your numbers: -> Worker thread #3 is executing Print. Numbers() Your numbers: -> Worker thread #4 is executing Print. Numbers() Your numbers: -> Worker thread #6 is executing Print. Numbers() Your numbers: -> Worker thread #7 is executing Print. Numbers() Your numbers: -> Worker thread #8 is executing Print. Numbers() Your numbers: -> Worker thread #9 is executing Print. Numbers() Your numbers: -> Worker thread #5 is executing Print. Numbers() Your numbers: 0, 0, 1, 1, 1, 2, 2, 2, 3, 3, 3, 2, 1, 0, 0, 4, 3, 4, 1, 2, 4, 5, 5, 5, 6, 6, 6, 2, 7, 7, 7, 3, 4, 0, 8, 4, 5, 1, 5, 8, 8, 9, 2, 6, 1, 0, 9, 1, 6, 2, 1, 9, 2, 1, 7, В, 3, 2, 3, 3, 9, 8, 4, 4, 5, 9, 4, 3, 5, 5, 6, 3, 6, 7, 4, 7, 6, В, 7, 4, 8, 5, 5, 6, 6, В, 7, 7, 9, 8, 9, 9, 9 32
Работа с потоками Синхронизация с использованием ключевого слова С# lock: private void Some. Private. Method() { // Использовать текущий объект как маркер потока. lock(this) { // Весь код внутри этого контекста безопасен к потокам. } } 33
Работа с потоками Программирование с использованием обратных вызовов Timer: class Program { static void Print. Time(object state) { Console. Write. Line("Time is: {0}", Date. Time. Now. To. Long. Time. String()); } static void Main(string[] args) { } } 34
Работа с потоками Программирование с использованием обратных вызовов Timer: static void Main(string [ ] args) { Console. Write. Line("***** Working with Timer type *****n"); // Создать делегат для типа Timer. Callback time. CB = new Timer. Callback(Print. Time); // Установить настройки таймера. Timer t = new Timer ( time. CB, // Объект-делегат Timer. Callback. null, // Информация для передачи в вызванный метод 0, // Период времени ожидания перед запуском (в миллисекундах). 1000); // Интервал времени между вызовами (в миллисекундах). Console. Write. Line ("Hit key to terminate. . . "); Console. Read. Line(); } 35
Работа с потоками Программирование с использованием обратных вызовов Timer (вывод): ***** Working with Timer type ***** Hit key to terminate. . . Time is: 6: 51: 48 PM Time is: 6: 51: 49 PM Time is: 6: 51: 50 PM Time is: 6: 51: 52 PM Press any key to continue. . . 36
Спасибо за внимание! 37
5. Программирование на языке C#.ppt