Конспекты по c# студента пфуртк Кириллова Игоря Евгеньевича группы ис-311

Get Started. It's Free
or sign up with your email address
Конспекты по c# студента пфуртк Кириллова Игоря Евгеньевича группы ис-311 by Mind Map: Конспекты по c# студента пфуртк Кириллова Игоря Евгеньевича группы ис-311

1. За27.03.2020

1.1. Процедуры и функции - методы класса

1.1.1. Первыми формами модульности, появившимися в языках программирования, были процедуры и функции. Они позволяли задавать определенную функциональность и многократно выполнять один и тот же параметризованный программный код при различных значениях параметров.

1.1.1.1. Для ООП-языков, к которым относится и язык C#, в роли архитектурного модуля выступает класс. Программная система строится из модулей, роль которых играют классы

1.1.1.1.1. Процедуры и функции связываются теперь с классом, они обеспечивают функциональность данных класса и называются методами класса. Главную роль в программной системе играют данные, а функции лишь служат данным.

2. За 06.04.2020

2.1. Строки C#. Классы String и StringBuilder

2.1.1. Класс String

2.1.1.1. Основным типом при работе со строками является тип string, задающий строки переменной длины. Класс String в языке C# относится к ссылочным типам.

2.1.2. Объявление строк. Конструкторы класса string

2.1.2.1. Объекты класса String объявляются как все прочие объекты простых типов - с явной или отложенной инициализацией, с явным или неявным вызовом конструктора класса.

2.1.2.1.1. у класса String достаточно много конструкторов. Они позволяют сконструировать строку из:

2.1.3. Операции над строками

2.1.3.1. Над строками определены следующие операции:

2.1.3.1.1. присваивание ( = );

2.1.3.1.2. две операции проверки эквивалентности ( == ) и ( != );

2.1.3.1.3. конкатенация или сцепление строк ( + );

2.1.3.1.4. взятие индекса ( [] ).

2.1.4. Строковые константы

2.1.4.1. В C# существуют два вида строковых констант:

2.1.4.1.1. обычные константы, которые представляют строку символов, заключенную в кавычки;

2.1.4.1.2. @-константы, заданные обычной константой c предшествующим знаком @.

2.1.5. Неизменяемый класс string

2.1.5.1. В языке C# существует понятие неизменяемый (immutable) класс. Для такого класса невозможно изменить значение объекта при вызове его методов.

2.1.5.1.1. К таким неизменяемым классам относится и класс String. Ни один из методов этого класса не меняет значения существующих объектов.

2.1.6. Методы Join и Split

2.1.6.1. Методы Join и Split выполняют над строкой текста взаимно обратные преобразования. Динамический метод Split позволяет осуществить разбор текста на элементы. Статический метод Join выполняет обратную операцию, собирая строку из элементов.

2.1.6.1.1. Заданный строкой текст зачастую представляет собой совокупность структурированных элементов - абзацев, предложений, слов, скобочных выражений и т.д. При работе с таким текстом необходимо разделить его на элементы, пользуясь специальными разделителями элементов, - это могут быть пробелы, скобки, знаки препинания.

2.1.7. Динамические методы класса String

2.1.7.1. Операции, разрешенные над строками в C#, разнообразны. Методы этого класса позволяют выполнять вставку, удаление, замену, поиск вхождения подстроки в строку. Класс String наследует методы класса Object, частично их переопределяя. Класс String наследует и, следовательно, реализует методы четырех интерфейсов: IComparable, ICloneable, IConvertible, IEnumerable.

2.1.8. Класс StringBuilder - построитель строк

2.1.8.1. Класс string не разрешает изменять существующие объекты. Строковый класс StringBuilder позволяет компенсировать этот недостаток. Этот класс принадлежит к изменяемым классам и его можно найти в пространстве имен System.Text.

2.1.9. Объявление строк. Конструкторы класса StringBuilder

2.1.9.1. Объекты этого класса объявляются с явным вызовом конструктора класса. Поскольку специальных констант этого типа не существует, то вызов конструктора для инициализации объекта просто необходим.

2.1.9.1.1. Конструктор класса перегружен, и наряду с конструктором без параметров, создающим пустую строку, имеется набор конструкторов, которым можно передать две группы параметров.

2.1.10. Операции над строками

2.1.10.1. Над строками этого класса определены практически те же операции с той же семантикой, что и над строками класса String

2.1.11. Основные методы

2.1.11.1. public StringBuilder Append (<объект>). К строке, вызвавшей метод, присоединяется строка, полученная из объекта, который передан методу в качестве параметра.

2.1.11.2. public StringBuilder Insert (int location,<объект>). Метод вставляет строку, полученную из объекта, в позицию, указанную параметром location. Метод Append является частным случаем метода Insert ;

2.1.11.3. public StringBuilder Remove (int start, int len). Метод удаляет подстроку длины len, начинающуюся с позиции start ;

2.1.11.4. public StringBuilder Replace (string str1,string str2). Все вхождения подстроки str1 заменяются на строку str2 ;

2.1.11.5. ublic StringBuilder AppendFormat (<строка форматов>, <объекты>). Метод является комбинацией метода Format класса String и метода Append.

2.1.12. Емкость буфера

2.1.12.1. Каждый экземпляр строки класса StringBuilder имеет буфер, в котором хранится строка. Объем буфера - его емкость - может меняться в процессе работы со строкой. Объекты класса имеют две характеристики емкости - текущую и максимальную. В процессе работы текущая емкость изменяется, естественно, в пределах максимальной емкости, которая реально достаточно высока. Если размер строки увеличивается, то соответственно автоматически растет и текущая емкость. Если же размер строки уменьшается, то емкость буфера остается на том же уровне

3. За 07.04.2020

3.1. Регулярные выражения

3.1.1. Пространство имен RegularExpression и классы регулярных выражений

3.1.1.1. Стандартный класс String позволяет выполнять над строками различные операции, в том числе поиск, замену, вставку и удаление подстрок. Существуют специальные операции, такие как Join, Split, которые облегчают разбор строки на элементы. Тем не менее, есть классы задач по обработке символьной информации, где стандартных возможностей явно не хватает. Чтобы облегчить решение подобных задач, в Net Framework встроен более мощный аппарат работы со строками, основанный на регулярных выражениях. Специальное пространство имен RegularExpression, содержит набор классов, обеспечивающих работу с регулярными выражениями.

3.1.1.1.1. пустое множество, а также множество, содержащее пустое слово, и одноэлементные множества, содержащие символы алфавита, являются регулярными базисными множествами;

3.1.1.1.2. если множества P и Q являются регулярными, то множества, построенные применением операций объединения, конкатенации и итерации - P>>Q, PQ, P*, Q* - тоже являются регулярными.

3.1.1.1.3. регулярные базисные выражения задаются символами и определяют соответствующие регулярные базисные множества

3.1.2. Синтаксис регулярных выражений

3.1.2.1. Регулярное выражение на C# задается строковой константой. Это может быть обычная или @ -константа. Чаще всего, следует использовать именно @ -константу.

3.1.2.1.1. Синтаксис регулярного выражения простой формулой не описать, здесь используются набор разнообразных средств:

3.1.3. Класс Regex

3.1.3.1. Это основной класс, всегда создаваемый при работе с регулярными выражениями. Объекты этого класса определяют регулярные выражения.

3.1.4. Классы Match и MatchCollection

3.1.4.1. объекты этих классов создаются автоматически при вызове методов Match и Matches. Коллекция MatchCollection, как и все коллекции, позволяет получить доступ к каждому ее элементу - объекту Match. Можно, конечно, организовать цикл foreach для последовательного доступа ко всем элементам коллекции.

3.1.4.1.1. основные свойства

3.1.5. Классы Group и GroupCollection

3.1.5.1. Коллекция GroupCollection возвращается при вызове свойства Group объекта Match. Имея эту коллекцию, можно добраться до каждого объекта Group, в нее входящего. Класс Group является наследником класса Capture и, одновременно, родителем класса Match. От своего родителя он наследует свойства Index, Length и Value, которые и передает своему потомку.

3.1.6. Классы Capture и CaptureCollection

3.1.6.1. Объекты этого перечисления описывают опции, влияющие на то, как устанавливается соответствие. Обычно такой объект создается первым и передается конструктору объекта класса Regex.

3.1.7. Перечисление RegexOptions

3.1.7.1. Объекты этого перечисления описывают опции, влияющие на то, как устанавливается соответствие.

3.1.8. Класс RegexCompilationInfo

3.1.8.1. При работе со сложными и большими текстами полезно предварительно скомпилировать используемые в процессе поиска регулярные выражения.

4. За 08.04.2020

4.1. Классы

4.1.1. Классы и ООП

4.1.1.1. Объектно-ориентированное программирование и проектирование построено на классах. Любую программную систему, выстроенную в объектном стиле, можно рассматривать как совокупность классов, возможно, объединенных в проекты, пространства имен, решения, как это делается при программировании в Visual Studio .Net.

4.1.2. Две роли классов

4.1.2.1. У класса две различные роли: модуля и типа данных. Класс - это модуль, архитектурная единица построения программной системы.

4.1.2.1.1. Модульность построения - основное свойство программных систем. В ООП программная система, строящаяся по модульному принципу, состоит из классов, являющихся основным видом модуля. Модуль может не представлять собой содержательную единицу - его размер и содержание определяется архитектурными соображениями, а не семантическими.

4.1.2.1.2. Класс - это тип данных, задающий реализацию некоторой абстракции данных, характерной для задачи, в интересах которой создается программная система.

4.1.3. Синтаксис класса

4.1.3.1. синтаксис описания класса: [атрибуты][модификаторы]class имя_класса[:список_родителей] {тело_класса}

4.1.3.1.1. В теле класса могут быть объявлены: константы ; поля ; конструкторы и деструкторы ; методы ; события; делегаты; классы (структуры, интерфейсы, перечисления).

4.1.4. Поля класса

4.1.4.1. Поля класса синтаксически являются обычными переменными (объектами) языка. Их описание удовлетворяет обычным правилам объявления переменных

4.1.4.2. Доступ к полям

4.1.4.2.1. Каждое поле имеет модификатор доступа, принимающий одно из четырех значений: public, private, protected, internal. Атрибутом доступа по умолчанию является атрибут private. Независимо от значения атрибута доступа, все поля доступны для всех методов класса

4.1.5. Методы класса

4.1.5.1. Методы класса синтаксически являются обычными процедурами и функциями языка. Их описание удовлетворяет обычным правилам объявления процедур и функций

4.1.5.2. Доступ к методам

4.1.5.2.1. Каждый метод имеет модификатор доступа, принимающий одно из четырех значений: public, private, protected, internal. Атрибутом доступа по умолчанию является атрибут private. Независимо от значения атрибута доступа, все методы доступны для вызова при выполнении метода класса.

4.1.5.3. Методы-свойства

4.1.5.3.1. Методы, называемые свойствами (Properties), представляют специальную синтаксическую конструкцию, предназначенную для обеспечения эффективной работы со свойствами.

4.1.6. Индексаторы

4.1.6.1. Свойства являются частным случаем метода класса с особым синтаксисом. Еще одним частным случаем является индексатор. Метод-индексатор является обобщением метода-свойства. Он обеспечивает доступ к закрытому полю, представляющему массив. Объекты класса индексируются по этому полю.

4.1.6.2. Синтаксически объявление индексатора

4.1.6.2.1. такое же, как и в случае свойств, но методы get и set приобретают аргументы по числу размерности массива, задающего индексы элемента, значение которого читается или обновляется.

4.1.7. Операции

4.1.7.1. Еще одним частным случаем являются методы, задающие над объектами-классами бинарную или унарную операцию. Введение в класс таких методов позволяет строить выражения, аналогичные арифметическим и булевым выражениям с обычно применяемыми знаками операций и сохранением приоритетов операций.

4.1.8. Статические поля и методы класса

4.1.8.1. Не все поля отражаются в структуре объекта. У класса могут быть поля, связанные не с объектами, а с самим классом. Эти поля объявляются как статические с модификатором static. Статические поля доступны всем методам класса.

4.1.8.1.1. Статические поля представляют общий информационный пул для всех объектов классов, позволяя извлекать и создавать общую информацию.

4.1.9. Константы

4.1.9.1. Константы фактически являются статическими полями, доступными только для чтения, значения которых задаются при инициализации. Однако задавать модификатор static для констант не только не нужно, но и запрещено.

4.1.10. Конструкторы класса

4.1.10.1. Конструктор - неотъемлемый компонент класса. Нет классов без конструкторов. Конструктор представляет собой специальный метод класса, позволяющий создавать объекты класса. Одна из синтаксических особенностей этого метода в том, что его имя должно совпадать с именем класса. Если программист не определяет конструктор класса, то к классу автоматически добавляется конструктор по умолчанию - конструктор без аргументов.

4.1.11. Деструкторы класса

4.1.11.1. В языке C# y класса может быть деструктор, но он не занимается удалением объектов и не вызывается нормальным образом в ходе выполнения программы. Так же, как и статический конструктор, деструктор класса, если он есть, вызывается автоматически в процессе сборки мусора. Его роль - в освобождении ресурсов, например, файлов, открытых объектом.

4.1.12. Проектирование класса Rational

4.1.12.1. Свойства класса Rational

4.1.12.1.1. Два целых числа - m и n представляют рациональное число. Они и становятся полями класса. Совершенно естественно сделать эти поля закрытыми. Разумная стратегия доступа к ним - "ни чтения, ни записи", поскольку пользователь не должен знать, как представлено рациональное число в классе, и не должен иметь доступа к составляющим рационального числа. Поэтому для таких закрытых полей не будут определяться методы-свойства.

4.1.12.2. Конструкторы класса Rational

4.1.12.2.1. Инициализация полей конструктором по умолчанию никак не может нас устраивать, поскольку нулевой знаменатель - это нонсенс. Поэтому определим конструктор с аргументами, которому будут передаваться два целых: числитель и знаменатель создаваемого числа. Кажется, что это единственный разумный конструктор, который может понадобиться нашему классу.

4.1.12.3. Методы класса Rational

4.1.12.3.1. Если поля класса почти всегда закрываются, чтобы скрыть от пользователя представление данных класса, то методы класса всегда имеют открытую часть - те сервисы (службы), которые класс предоставляет своим клиентам и наследникам.

4.1.12.4. Печать рациональных чисел

4.1.12.4.1. Почти любой класс содержит один или несколько методов, позволяющих выводить на печать данные о классе. Такой метод имеется и в классе Rational. Вот его текст: public void PrintRational(string name) { Console.WriteLine(" {0} = {1}/{2}",name,m,n); }

4.1.13. Операции над рациональными числами

4.1.13.1. Определим над рациональными числами стандартный набор операций - сложение и вычитание, умножение и деление. Реализуем эти операции методами с именами Plus, Minus, Mult, Divide соответственно.

5. За 10.04.2020

5.1. Отношения между классами. Клиенты и наследники

5.1.1. Отношения между классами

5.1.1.1. Два основных типа отношений между классами определены в ОО-системах. Первое отношение "клиенты и поставщики", называется часто клиентским отношением или отношением вложенности (встраивания). Второе отношение "родители и наследники" называется отношением наследования.

5.1.1.1.1. Классы А и В находятся в отношении " клиент-поставщик ", если одним из полей класса В является объект класса А. Класс А называется поставщиком класса В, класс В называется клиентом класса А.

5.1.1.1.2. Классы А и В находятся в отношении " родитель - наследник ", если при объявлении класса В класс А указан в качестве родительского класса. Класс А называется родителем класса В, класс В называется наследником класса А.

5.1.2. Отношения "является" и "имеет"

5.1.2.1. Рассмотрим совсем простой пример двух классов - Square и Rectangle, описывающих квадраты и прямоугольники.

5.1.2.1.1. эти классы следует связать скорее отношением наследования, чем вложенности

5.1.3. Расширение определения клиента класса

5.1.3.1. Класс B называется клиентом класса A, если в классе B создаются объекты класса A - поля или локальные переменные - или вызываются статические поля или методы класса A.

5.1.4. Отношения между клиентами и поставщиками

5.1.4.1. Класс-поставщик создает свойства (поля) и сервисы (методы), предоставляемые своим клиентам. Клиенты создают объекты поставщика. Вызывая доступные им методы и поля объектов, они управляют работой созданных объектов поставщика. Клиенты не могут ни повлиять на поведение методов поставщика, ни изменить состав предоставляемых им полей и методов, они не могут вызывать закрытые поставщиком поля и методы класса.

5.1.5. Наследование

5.1.5.1. Мощь ООП основана на наследовании. Когда построен полезный класс, то он может многократно использоваться. Повторное использование - это одна из главных целей ООП. Но и для хороших классов наступает момент, когда необходимо расширить возможности класса. Всякая попытка изменять сам работающий класс чревата большими неприятностями. Здесь-то и приходит на выручку наследование. Существующий класс не меняется, но создается его потомок, продолжающий дело отца, только уже на новом уровне.

5.1.5.1.1. Класс- потомок наследует все возможности родительского класса - все поля и все методы, открытую и закрытую часть класса.

5.1.6. Конструкторы родителей и потомков

5.1.6.1. При создании конструкторов классов потомков есть одна важная особенность. Всякий конструктор создает объект класса - структуру, содержащую поля класса. Но потомок, прежде чем создать собственный объект, вызывает конструктор родителя, создавая родительский объект, который затем будет дополнен полями потомка. Ввиду транзитивности этого процесса, конструктор родителя вызывает конструктор своего родителя, и этот процесс продолжается, пока первым делом не будет создан объект прародителя.

5.1.7. Добавление методов и изменение методов родителя

5.1.7.1. Потомок может создать новый собственный метод с именем, отличным от имен наследуемых методов.

5.1.7.1.1. Если потомок создает метод с именем, совпадающим с именем метода предков, то возможны три ситуации:

5.1.8. Статический контроль типов и динамическое связывание

5.1.8.1. Контролем типов называется проверка каждого вызова, удостоверяющая, что:

5.1.8.1.1. в классе A1 объекта x1 действительно имеется метод M

5.1.8.1.2. список фактических аргументов в точке вызова соответствует по числу и типам списку формальных аргументов метода M, заданного в классе A1.

5.1.8.2. Контроль типов, выполняемый на этапе компиляции, называется статическим контролем типов.

5.1.9. Три механизма, обеспечивающие полиморфизм

5.1.9.1. одностороннее присваивание объектов внутри семейства классов; сущность, базовым классом которой является класс предка

5.1.9.2. переопределение потомком метода, наследованного от родителя.

5.1.9.3. динамическое связывание, позволяющее в момент выполнения вызывать метод, который принадлежит целевому объекту.

5.1.10. Абстрактные классы

5.1.10.1. Класс называется абстрактным, если он имеет хотя бы один абстрактный метод.

5.1.10.2. Метод называется абстрактным, если при определении метода задана его сигнатура, но не задана реализация метода.

6. За 14.04.20

6.1. Функциональный тип в C#. Делегаты

6.1.1. Как определяется функциональный тип и как появляются его экземпляры

6.1.1.1. Делегат задает определение функционального типа (класса) данных. Экземплярами класса являются функции. Описание делегата в языке C# представляет собой описание еще одного частного случая класса. Каждый делегат описывает множество функций с заданной сигнатурой. Каждая функция (метод), сигнатура которого совпадает с сигнатурой делегата, может рассматриваться как экземпляр класса, заданного делегатом.

6.1.2. Функции высших порядков

6.1.2.1. Функцией высшего порядка называется такая функция (метод) класса, у которой один или несколько аргументов принадлежат к функциональному типу.

6.1.3. Построение программных систем методом "раскрутки". Функции обратного вызова

6.1.3.1. Метод "раскрутки"

6.1.3.1.1. является одним из основных методов функционально-ориентированного построения сложных программных систем. Суть его состоит в том, что программная система создается слоями. Вначале пишется ядро системы - нулевой слой, реализующий базовый набор функций. Затем пишется первый слой с новыми функциями, которые интенсивно вызывают в процессе своей работы функции ядра.

6.1.4. Делегаты как свойства

6.1.4.1. ситуация, при которой в некотором классе объявлялись функции, удовлетворяющие контракту с делегатом, но создание экземпляров делегата и их инициирование функциями класса выполнялось в другом месте, там, где предполагалось вызывать соответствующие функции. Чаще всего, создание экземпляров удобнее возложить на класс, создающий требуемые функции. Более того, в этом классе делегат можно объявить как свойство класса

6.1.5. Операции над делегатами. Класс Delegate

6.1.5.1. Ключевое слово delegate позволяет задать определение функционального типа (класса), фиксирующее контракт, которому должны удовлетворять все функции, принадлежащие классу. Функциональный класс можно рассматривать как ссылочный тип, экземпляры которого являются ссылками на функции.

6.1.6. Операции "+" и "-"

6.1.6.1. Наряду с методами, над делегатами определены и две операции: "+" и "-", которые являются более простой формой записи добавления делегатов в список вызовов и удаления из списка. Операции заменяют собой методы Combine и Remove.

7. 16.04.2020

7.1. Универсальность. Классы с родовыми параметрами

7.1.1. Наследование и универсальность

7.1.1.1. Необходимость в универсализации возникает с первых шагов программирования. Одна из первых процедур, появляющихся при обучении программированию - это процедура свопинга:обмен значениями двух переменных одного типа.

7.1.1.1.1. Выглядит она примерно так: public void Swap(ref T x1, ref T x2) { T temp; temp = x1; x1 = x2; x2 = temp; }

7.1.2. Синтаксис универсального класса

7.1.2.1. Объявить класс C# универсальным просто: для этого достаточно указать в объявлении класса, какие из используемых им типов являются параметрами.

7.1.3. Ограниченная универсальность

7.1.3.1. В языке C# допускаются три вида ограничений, накладываемых на родовые параметры.

7.1.3.1.1. Ограничение наследования. Это основной вид ограничений, указывающий, что тип T является наследником некоторого класса и ряда интерфейсов.

7.1.3.1.2. Ограничение конструктора. Это ограничение указывает, что тип T имеет конструктор без аргументов и, следовательно, позволяет создавать объекты типа T.

7.1.3.1.3. Ограничение value/reference. Это ограничение указывает, к значимым или к ссылочным типам относится тип T.

7.1.4. Универсальность и специальные случаи классов

7.1.4.1. Универсальность - это механизм, воздействующий на все элементы языка.

7.1.4.2. Универсальные структуры

7.1.4.2.1. Так же, как и обычный класс, структура может иметь родовые параметры. Синтаксис объявления, ограниченная универсальность, другие детали универсальности естественным образом распространяются на структуры.

7.1.4.3. Универсальные интерфейсы

7.1.4.3.1. Интерфейсы чаще всего следует делать универсальными, предоставляя большую гибкость для позднейших этапов создания системы.

7.1.4.4. Универсальные делегаты

7.1.4.4.1. также могут иметь родовые параметры. Чаще встречается ситуация, когда делегат объявляется в универсальном классе и использует в своем объявлении параметры универсального класса.

8. 22.04.2020

8.1. Организация интерфейса и рисование в формах

8.1.1. Организация интерфейса

8.1.1.1. Application, который создает объект класса Form1 и открывает форму - видимый образ объекта - для интерактивной работы пользователя. Открываемая форма содержит пользовательский интерфейс - окошки, кнопки, списки, другие элементы управления, меню . Все эти элементы способны реагировать на события, возникающие при выполнении пользователем каких-либо действий - нажатии кнопок, ввода текста, выбора пунктов меню.

8.1.2. Форма и элементы управления

8.1.2.1. Как населить форму элементами управления? Чаще всего, это делается вручную в режиме проектирования. Доступные элементы управления, отображаемые на специальной панели (Toolbox), перетаскиваются на форму. Этот процесс поддерживается особым инструментарием - дизайнером форм (Designer Form). Как только на этапе проектирования вы сажаете на форму элемент управления, немедленно в тексте класса появляются соответствующие строки кода

8.1.2.2. Модальные и немодальные формы

8.1.2.2.1. Окно называется модальным, если нельзя закончить работу в открытом окне до тех пор, пока оно не будет закрыто.

8.1.2.2.2. Немодальные окна допускают параллельную работу в окнах.

8.1.2.3. Наследование форм

8.1.2.3.1. Для объектного программиста форма - это обычный класс, а населяющие ее элементы управления - это поля класса. Так что создать новую форму - новый класс, наследующий все поля, методы и события уже существующей формы - не представляет никаких проблем. Достаточно написать, как обычно, одну строку: public class NewForm : InterfacesAndDrawing.TwoLists

8.1.3. Организация меню в формах

8.1.3.1. Меню и панели с кнопками можно создавать как вручную в режиме проектирования, так и программно.

8.1.3.1.1. Для построения в режиме проектирования главного меню и связанной с ним структуры достаточно перетащить на форму элемент управления, называемый MainMenu.После перетаскивания метка с изображением этого элемента управления появляется ниже формы, а на форме появляется элемент меню с информационным полем, в котором можно задать название пункта меню

8.1.4. Рисование в форме

8.1.4.1. Графика необходима при организации пользовательского интерфейса. Образы информативнее текста. Framework .Net реализует расширенный графический интерфейс GDI+, обладающий широким набором возможностей.

8.1.4.2. Класс Graphics

8.1.4.2.1. это основной класс, необходимый для рисования. Класс Graphics, так же, как и другие рассматриваемые здесь классы для перьев и кистей, находятся в пространстве имен Drawing

8.1.4.2.2. Методы класса Graphics

8.1.5. Событие Paint

8.1.5.1. Оно возникает всякий раз, когда область, в которой происходило рисование, повреждена. Причины этого могут быть разные - пользователь свернул форму, изменил ее размеры, произошло перекрытие другой формой, был вызван метод Invalidate - во всех этих случаях требуется перерисовать область.

9. За 26.03.2020

9.1. Массивы языка C#

9.1.1. Массив задает способ организации данных. Массивом называют упорядоченную совокупность элементов одного типа. Каждый элемент массива имеет индексы, определяющие порядок элементов. Число индексов характеризует размерность массива. Каждый индекс изменяется в некотором диапазоне [a,b].

9.1.1.1. Диапазон [a,b] называется граничной парой, a - нижней границей, b - верхней границей индекса. При объявлении массива границы задаются выражениями. Если все границы заданы константными выражениями, то число элементов массива известно в момент его объявления и ему может быть выделена память еще на этапе трансляции. Такие массивы называются статическими.

9.1.1.1.1. В языке C# снято существенное ограничение языка C++ на статичность массивов. Массивы в языке C# являются настоящими динамическими массивами. Как следствие этого, напомню, массивы относятся к ссылочным типам, память им отводится динамически в "куче". К сожалению, не снято ограничение 0-базируемости, хотя, на мой взгляд, в таком ограничении уже нет логики из-за отсутствия в C# адресной арифметики. Было бы гораздо удобнее во многих задачах иметь возможность работать с массивами, у которых нижняя граница не равна нулю.

10. За 28.03.2020

10.1. Класс Array и новые возможности массивов

10.1.1. Класс Array

10.1.1.1. Нельзя понять многие детали работы с массивами в C#, если не знать устройство класса Array из библиотеки FCL, потомками которого являются все классы-массивы. Рассмотрим следующие объявления: //Класс Array int[] ar1 = new int[5]; double[] ar2 ={5.5, 6.6, 7.7}; int[,] ar3 = new Int32[3,4];

10.1.1.1.1. объекты ar1, ar2 и ar3 принадлежат к разным классам.

10.1.1.1.2. У всех классов, являющихся массивами, много общего, поскольку все они являются потомками класса System.Array. Класс System.Array наследует ряд интерфейсов: ICloneable, IList, ICollection, IEnumerable, а, следовательно, обязан реализовать все их методы и свойства.

11. ЗА 04.04.2020

11.1. Символы и строки постоянной длины в C#

11.1.1. Общий взгляд

11.1.1.1. Когда говорят о строковом типе, то обычно различают тип, представляющий:

11.1.1.1.1. отдельные символы, чаще всего, его называют типом char ;

11.1.1.1.2. строки постоянной длины, часто они представляются массивом символов;

11.1.1.1.3. строки переменной длины - это, как правило, тип string, соответствующий современному представлению о строковом типе.

11.1.2. Строки С++

11.1.2.1. В языке С++ есть все виды строк. Символьный тип char используется для задания отдельных символов. Для строк постоянной длины можно использовать массив символов - char[]. Особенностью, характерной для языка С++, точнее для языка С, является завершение строки символом с нулевым кодом. Строки, завершаемые нулем, называются обычно строками С. Массив char[] задает строку С и потому должен иметь размер, по крайней мере, на единицу больше фактического размера строки.

11.1.3. Строки С#

11.1.3.1. В C# есть символьный класс Char, основанный на классе System.Char и использующий двухбайтную кодировку Unicode представления символов. Для этого типа в языке определены символьные константы - символьные литералы.

11.1.3.1.1. Константу можно задавать:

11.1.3.1.2. Класс Char, как и все классы в C#, наследует свойства и методы родительского класса Object. Но у него есть и собственные методы и свойства, и их немало.

11.1.4. Класс char[] - массив символов

11.1.4.1. В языке C# определен класс Char[], и его можно использовать для представления строк постоянной длины, как это делается в С++.

11.1.4.1.1. Массив char[] - это обычный массив. Более того, его нельзя инициализировать строкой символов, как это разрешается в С++. Константа, задающая строку символов, принадлежит классу String, а в C# не определены взаимные преобразования между классами String и Char[], даже явные. У класса String есть, правда, динамический метод ToCharArray, задающий подобное преобразование. Возможно также посимвольно передать содержимое переменной string в массив символов.

11.1.5. Существует ли в C# тип char*

11.1.5.1. В языке C# указатели допускаются в блоках, отмеченных как небезопасные. Теоретически в таких блоках можно объявить переменную типа Char*, но все равно не удастся написать столь же короткую, как в С++, процедуру копирования строк. Правильно считать, что в C# строки типа char* использовать не рекомендуется.

12. За 09.04.2020

12.1. Структуры и перечисления

12.1.1. Развернутые и ссылочные типы

12.1.1.1. Рассмотрим объявление объекта класса T с инициализацией: T x = new T();

12.1.1.1.1. Класс T относится к развернутому типу, если память отводится сущности x ; объект разворачивается на памяти, жестко связанной с сущностью.

12.1.1.1.2. Класс T относится к ссылочному типу, если память отводится объекту; сущность x является ссылкой на объект.

12.1.2. Классы и структуры

12.1.2.1. Структура - это частный случай класса.

12.1.2.1.1. чем следует руководствоваться, делая выбор между структурой и классом? Полагаю, можно пользоваться следующими правилами:

12.1.3. Структуры

12.1.3.1. Синтаксис структур

12.1.3.1.1. Синтаксис объявления структуры аналогичен синтаксису объявления класса: [атрибуты][модификаторы]struct имя_структуры[:список_интерфейсов] {тело_структуры}

12.1.4. Класс Rational или структура Rational

12.1.4.1. его вполне разумно представить в виде структуры. Наследование ему не нужно. Семантика присваивания развернутого типа больше подходит для рациональных чисел, чем ссылочная семантика, ведь рациональные числа - это еще один подкласс арифметического класса. В общем, класс Rational - прямой кандидат в структуры.

12.1.4.1.1. В конструкторе класса Rational вызывается метод nod, а вызов методов в конструкторе запрещен. Нетрудно обойти это ограничение, изменив конструктор, то есть явно задав вычисление общего делителя в его теле.

12.1.5. Встроенные структуры

12.1.5.1. все значимые типы языка реализованы структурами. В библиотеке FCL имеются и другие встроенные структуры. Рассмотрим в качестве примера структуры Point, PointF, Size, SizeF и Rectangle, находящиеся в пространстве имен System.Drawing и активно используемые при работе с графическими объектами. Первые четыре структуры имеют два открытых поля X и Y ( Height и Width ), задающие для точек - структур Point и PointF - координаты, целочисленные или в форме с плавающей точкой. Для размеров - структур Size и SizeF - они задают высоту и ширину, целочисленными значениями или в форме с плавающей точкой. Структуры Point и Size позволяют задать прямоугольную область - структуру Rectangle.

12.1.6. Перечисления

12.1.6.1. это частный случай класса, класс, заданный без собственных методов. Перечисление задает конечное множество возможных значений, которые могут получать объекты класса перечисление. Поскольку у перечислений нет собственных методов, то синтаксис объявления этого класса упрощается - остается обычный заголовок и тело класса, содержащее список возможных значений.

12.1.6.1.1. формальное определение синтаксиса перечислений: [атрибуты][модификаторы]enum имя_перечисления[:базовый класс] {список_возможных_значений}

13. За 11.04.2020

13.1. Интерфейсы. Множественное наследование

13.1.1. Интерфейсы

13.1.1.1. интерфейс - это частный случай класса. Интерфейс представляет собой полностью абстрактный класс, все методы которого абстрактны.

13.1.1.1.1. От абстрактного класса интерфейс отличается некоторыми деталями в синтаксисе и поведении. Синтаксическое отличие состоит в том, что методы интерфейса объявляются без указания модификатора доступа. Отличие в поведении заключается в более жестких требованиях к потомкам. Класс, наследующий интерфейс, обязан полностью реализовать все методы интерфейса.

13.1.2. Преобразование к классу интерфейса

13.1.2.1. Создать объект класса интерфейса обычным путем с использованием конструктора и операции new нельзя. Тем не менее, можно объявить объект интерфейсного класса и связать его с настоящим объектом путем приведения ( кастинга ) объекта наследника к классу интерфейса. Это преобразование задается явно. Имея объект, можно вызывать методы интерфейса - даже если они закрыты в классе, для интерфейсных объектов они являются открытыми.

13.1.3. Проблемы множественного наследования

13.1.3.1. Коллизия имен

13.1.3.1.1. возникает, когда два или более интерфейса имеют методы с одинаковыми именами и сигнатурой.

13.1.3.2. Наследование от общего предка

13.1.3.2.1. характерна, в первую очередь, для множественного наследования классов. Если класс C является наследником классов A и B, а те, в свой черед, являются наследниками класса Parent, то класс наследует свойства и методы своего предка Parent дважды, один раз получая их от класса A, другой от - B.

13.1.4. Упорядоченность объектов и интерфейс IComparable

13.1.4.1. Этот интерфейс имеет всего один метод CompareTo (object obj), возвращающий целочисленное значение, положительное, отрицательное или равное нулю, в зависимости от выполнения отношения "больше", "меньше" или "равно".

13.1.5. Клонирование и интерфейс ICloneable

13.1.5.1. Клонирование

13.1.5.1.1. называется процесс создания копии объекта, а копия объекта называется его клоном.

13.1.6. Класс с атрибутом сериализации

13.1.6.1. Класс, объекты которого предполагается сериализовать стандартным образом, должен при объявлении сопровождаться атрибутом [Serializable].

13.1.6.1.1. Стандартная сериализация предполагает два способа сохранения объекта

13.1.7. Интерфейс ISerializable

13.1.7.1. можно самому управлять процессом сериализации. В этом случае наш класс должен быть наследником интерфейса ISerializable. Класс, наследующий этот интерфейс, должен реализовать единственный метод этого интерфейса GetObjectData и добавить защищенный конструктор.

14. За 14.04.2020

14.1. События

14.1.1. Классы с событиями

14.1.1.1. Класс задает свойства и поведение своих экземпляров. Методы класса определяют поведение объектов, свойства - их состояние.

14.1.2. Класс sender. Как объявляются события?

14.1.2.1. Обработчик события - это обычная процедура с аргументами.

14.1.2.2. Делегаты и события

14.1.2.2.1. Вначале объявляется делегат - функциональный класс, задающий сигнатуру.

14.1.2.2.2. Если делегат определен, то в классе Sender, создающем события, достаточно объявить событие как экземпляр соответствующего делегата.

14.1.3. Как зажигаются события

14.1.3.1. Причины возникновения события могут быть разными. Поэтому вполне вероятно, что одно и то же событие будет зажигаться в разных методах класса в тот момент, когда возникнет одна из причин появления события.

14.1.4. Классы receiver. Как обрабатываются события

14.1.4.1. Объекты класса Sender создают события и уведомляют о них объекты, возможно, разных классов, названных нами классами Receiver, или клиентами.

14.1.4.1.1. класс receiver должен:

14.1.5. Классы с событиями, допустимые в каркасе .Net Framework

14.1.5.1. Если создавать повторно используемые компоненты с событиями, работающие не только в проекте C#, то необходимо удовлетворять некоторым ограничениям. Эти требования предъявляются к делегату; они носят, скорее, синтаксический характер, не ограничивая существа дела.

14.1.6. Две проблемы с обработчиками событий

14.1.6.1. Объекты, создающие события, ничего не знают об объектах, обрабатывающих эти события. Объекты, обрабатывающие события, ничего не знают друг о друге, независимо выполняя свою работу.

14.1.6.1.1. Игнорирование коллег

14.1.6.1.2. Переопределение значений аргументов события

14.1.7. Классы с большим числом событий

14.1.7.1. Если у класса много объявленных событий, а реально возникает лишь малая часть из них, то предпочтительнее динамический подход, когда память отводится только фактически возникшим событиям.

15. За 22.04.2020

15.1. Отладка и обработка исключительных ситуаций

15.1.1. Корректность и устойчивость программных систем

15.1.1.1. два основных качества программной системы, без которых все остальные ее достоинства не имеют особого смысла.

15.1.1.1.1. Корректность - это способность программной системы работать в строгом соответствии со своей спецификацией.

15.1.1.1.2. Отладка - процесс, направленный на достижение корректности.

15.1.1.1.3. Устойчивость - это способность программной системы должным образом реагировать на исключительные ситуации.

15.1.1.1.4. Обработка исключительных ситуаций - процесс, направленный на достижение устойчивости.

15.1.2. Жизненный цикл программной системы

15.1.2.1. Под " жизненным циклом " понимается период от замысла программного продукта до его "кончины". Обычно рассматриваются следующие фазы этого процесса:

15.1.2.1.1. Проектирование <-> Разработка <-> Развертывание и Сопровождение

15.1.3. Три закона программотехники

15.1.3.1. Первый закон (закон для разработчика)-Этот закон отражает сложность нетривиальных систем.

15.1.3.2. Второй закон (закон для пользователя)-любая система, что бы она ни делала, при любом постусловии корректна по отношению к предусловию False, поскольку невозможно подобрать ни один набор входных данных, удовлетворяющих этому предусловию.

15.1.3.3. Третий закон (закон чечако)-Неквалифицированный пользователь в любом контексте всегда способен выбрать наименее подходящее действие, явно не удовлетворяющее спецификации, которая ориентирована на "разумное" поведение пользователей.

15.1.4. Отладка

15.1.4.1. для создания корректного и устойчивого программного продукта как минимум, необходимо:

15.1.4.1.1. создать надежный код, корректность которого предусматривается с самого начала;

15.1.4.1.2. отладить этот код;

15.1.4.1.3. предусмотреть в нем обработку исключительных ситуаций.

15.1.5. Создание надежного кода

15.1.5.1. Для повышения надежности нужно уменьшить сложность системы, и главное в этом процессе - это повторное использование.

15.1.6. Искусство отладки

15.1.6.1. Средства, используемые при отладке, можно разделить на инструментарий, предоставляемый средой разработки Visual Studio .Net, и программные средства, предоставляемые языком и специальными классами библиотеки FCL.

15.1.6.2. Одним из основных средств отладки является отладочная печать, позволяющая получить данные о ходе и состоянии процесса вычислений.

15.1.7. Отладка и инструментальная среда Visual Studio .Net

15.1.7.1. Инструментальная среда студии предоставляет программисту самый широкий спектр возможностей слежения за ходом вычислений и отслеживания состояний, в котором находится процесс вычислений.

15.1.8. Обработка исключительных ситуаций

15.1.8.1. Какой бы надежный код ни был написан, сколь бы тщательной ни была отладка, в версии, переданной в эксплуатацию и на сопровождение, при запусках будут встречаться нарушения спецификаций.

15.1.8.1.1. В системе остается последняя ошибка, находятся пользователи, не знающие спецификаций, и если спецификацию можно нарушить, то это событие когда-нибудь да произойдет. В таких исключительных ситуациях продолжение выполнения программы либо становится невозможным, либо в возникшей ситуации применение алгоритма приведет к ошибочным результатам.

16. За 24.04.2020

16.1. Финальный проект

16.1.1. Абстрактный класс Figure

16.1.1.1. Абстрактный класс, относящийся к этапу проектирования системы, вместе с тем является важнейшим элементом заключительного семейства классов. В этом проявляется мощь объектно-ориентированного подхода к разработке программных систем.

16.1.2. Класс LittleCircle

16.1.2.1. Этот класс, задающие маленькие кружочки фиксированного радиуса, в свою очередь, является наследником класса Circle.

16.1.2.1.1. using System; namespace Shapes { /// <summary> /// Класс LittleCircle - потомок класса Circle. /// </summary> public class LittleCircle:Circle { public LittleCircle(int x,int y): base(4,x,y) { // маленький круг радиуса 4 } } }

16.1.3. Класс Square

16.1.3.1. Квадрат - это частный случай прямоугольника. Соответствующий класс является потомком класса Rect

16.1.3.1.1. using System; namespace Shapes { /// <summary> /// Класс Square - потомок класса Rect. /// </summary> public class Square:Rect { public Square(int side, int x, int y): base(side,side,x,y) { //квадрат - это прямоугольник с равными сторонами } } }

16.1.4. Класс Person

16.1.4.1. Этот класс является прямым потомком класса Figure. Вместе с тем, класс является клиентом трех других классов семейства - Circle, Rect и LittleCircle, поскольку элементы фигуры, составляющие человечка, являются объектами этих классов.