
- •Введение
- •Создание простого приложения в ms Visual Studio
- •Отладка программы
- •Пошаговый режим
- •Точки останова
- •Безусловные точки останова
- •Условные точки останова
- •Просмотр переменных
- •Стек вызова функций
- •Разработка оконных приложений
- •Размещение компонентов на форме. Свойства компонента.
- •Компонент CheckBoxListBox
- •Переменные
- •Приведение типов
- •Операции, приоритет
- •Перегрузка операций
- •If(выражение_1) оператор_1
- •Циклы While
- •Цикл foreach
- •Программирование классов
- •Введение в классы и объекты в с#
- •Общий синтаксис класса
- •Поля и свойства
- •Использование переменного числа аргументов
- •Объявление объектов класса. Оператор new
- •Инциализация членов класса
- •Конструкторы и деструкторы
- •Ключевое слово this
- •Ключевое слово static
- •Наследование
- •Полиморфизм.
- •Абстрактные классы
- •Интерфейсы
- •Реализация интерфейсов
- •Интерфейсные свойства
- •Интерфейсные индексаторы
- •Массивы
- •Обработка исключительных ситуаций
- •Предварительная проверка параметров
- •Проверка кодов возврата функций и методов
- •Применение механизма исключений
- •Блоки try-catch
- •Применение блока finally
- •Массивы как коллекции
- •Коллекция ArrayList
Компонент CheckBoxListBox
Компонент
CheckBoxListBox предназначен
для размещения группы элементов CheckBox,
объединенной общим контейнером. Для
включения элементов в контейнер
CheckBoxListBox необходимо
перейдя к свойству Items
нажать кнопочку
рядом со значением этого свойства. В
результате появиться окно, представленное
на рисунке 8.
Рисунок 8 – Добавление элементов в CheckBoxListBox
Здесь необходимо ввести подписи для элементов CheckBox, которые будут помещены в CheckBoxListBox и нажать OK. В результате чего данные элементы будут добавлены в группу, которая показана на рисунке 9.
Рисунок 9 – Компонент CheckBoxListBox
Компонент RadioButton
RadioButton по своим свойствам немного похожи на CheckBox. Его главное отличие заключается в том, что группа чекбоксов позволяет выбрать любую комбинацию параметров, радиокнопки же дают возможность выбрать только один параметр. Из этого различия проистекают и все остальные. Например, в группе не может быть меньше двух радиокнопок. Кроме того, у радиокнопок не может быть смешанного состояния (нельзя совместить взаимоисключающие параметры).
Компонент TextBox
Этот элемент управления является основным, предназначенным для ввода пользователем текстовых данных. Использовать TextBox можно в однострочном или многострочном режиме. Однако данный элемент управления имеет ограничение — до 64 килобайт текста. Если вам необходимо обрабатывать большие объемы информации, лучше использовать элемент RichTextBox.
К основным обработчикам событий данного компонента относят Key Press, который позволяет, например, ограничить тип вводимых значений в данное поле, и TextChanged, который выполняет какие-либо действия при вводе текста в область компонента TextBox.
Компонент RichTextBox
Данный элемент управления дает возможность пользователю вводить и обрабатывать большие объемы информации (более 64 килобайт). Кроме того, RichTextBox позволяет редактировать цвет текста, шрифт, добавлять изображения. RichTextBox включает все возможности текстового редактора Microsoft Word.
Вводить текст в RichTextBox можно с помощью свойства Text данного элемента, которое предоставляет окно, в которое осуществляется ввод.
Общий вид RichTextBox представлен на рисунке 10.
Рисунок 10 - Компонент RichTextBox
Компонент ListBox
ListBox – простейший вариант пролистываемого списка. Он позволяет выбирать один или несколько хранящихся в списке элементов. Кроме того, ListBox имеет возможность отображать данные в нескольких колонках. Это позволяет представлять данные в большем объеме и не утомлять пользователя пролистыванием.
Задать список элементов в ListBox можно так же как и для компонента CheckBoxListBox с помощью свойства Items.
Общий вид ListBox представлен на рисунке 11.
Рисунок 11 – Компонент ListBox
Компонент ComboBox
Этот вариант списка удобен тем, что не занимает много пространства на форме. Постоянно на форме представлено только одно значение этого списка. При необходимости пользователь может раскрыть список и выбрать другое интересующее его значение. Кроме того, режим DropDown дает пользователю возможность вводить собственное значение при отсутствии необходимого значения в списке.
Задать список элементов в ComboBox можно так же как и в предыдущем случае с помощью свойства Items.
Общий вид ComboBox представлен на рисунке 12.
Рисунок 12 – Компонент ComboBox
Компонент Label
Элемент управления Label предназначен для создания подписей к другим элементам управления или для вывода информационных сообщений прямо на поверхност формы. Например, вы можете сочетать метки с полями ввода как показано на рисунке 13.
Рисунок 13 – Компонент Label в сочетании с TextBox
Текст метки можно менять с помощью свойства Text.
Компонент LinkLabel
LinkLabel представляет собой гиперссылку, которыми наполнен Интернет. Разработчики Visual Studio представили этот элемент управления как разновидность метки (элемента управления Label). Но по своему назначению LinkLabel более похож на кнопку, чем на метку.
Общий вид LinkLabel представлен на рисунке 14.
Рисунок 14 – Компонент Label в сочетании с TextBox
Компонент ProgressBar
Чаще всего ProgressBar используют для отображения степени завершенности той или иной задачи. Вы сталкивались с индикатором прогресса, когда устанавливали на свой компьютер Visual Studio.
Общий вид ProgressBar представлен на рисунке 15.
Рисунок 15 – Компонент Label в сочетании с TextBox
Первоначальное значение этого элемента можно задать свойством Value, максимальное значение - свойством Maximum, а минимальное - свойством Manimum.
Пример размещения компонентов в приложении
На рисунке 16 представлено окно приложения, которое демонстрирует рассмотренные выше компоненты в действии.
Рисунок 16 – Пример
При размещении этих компонентов Visual Studio автоматически создала код для каждого компонента, который можно просмотреть, выбрав вкладку Form.Designer.cs, где расположен исходный текст данного приложения.
Окно Form1.Designer.cs показано на рисунке 17.
Рисунок 17 – Пример
Далее приведен код, который был сгенерирован для данного приложения:
#region Windows Form Designer generated code
/// <summary>
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
/// </summary>
private void InitializeComponent()
{
this.button1 = new System.Windows.Forms.Button();
this.checkedListBox1 = new System.Windows.Forms.CheckedListBox();
this.label1 = new System.Windows.Forms.Label();
this.listBox1 = new System.Windows.Forms.ListBox();
this.label4 = new System.Windows.Forms.Label();
this.radioButton1 = new System.Windows.Forms.RadioButton();
this.radioButton2 = new System.Windows.Forms.RadioButton();
this.radioButton3 = new System.Windows.Forms.RadioButton();
this.radioButton4 = new System.Windows.Forms.RadioButton();
this.label5 = new System.Windows.Forms.Label();
this.button2 = new System.Windows.Forms.Button();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.SuspendLayout();
//
// button1
//
this.button1.Location = new System.Drawing.Point(12, 342);
this.button1.Name = "button1";
this.button1.Size = new System.Drawing.Size(75, 23);
this.button1.TabIndex = 0;
this.button1.Text = "ОК";
this.button1.UseVisualStyleBackColor = true;
//
// checkedListBox1
//
this.checkedListBox1.FormattingEnabled = true;
this.checkedListBox1.Items.AddRange(new object[] {
"ComboBox",
"TextBox",
"ProgressBar",
"RichTextBox"});
this.checkedListBox1.Location = new System.Drawing.Point(15, 25);
this.checkedListBox1.Name = "checkedListBox1";
this.checkedListBox1.Size = new System.Drawing.Size(181, 64);
this.checkedListBox1.TabIndex = 2;
//
// label1
//
this.label1.AutoSize = true;
this.label1.Location = new System.Drawing.Point(12, 9);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(349, 13);
this.label1.TabIndex = 3;
this.label1.Text = "Какой элемент лучше использовать для большого объема текста?";
this.label1.Click += new System.EventHandler(this.label1_Click);
//
// listBox1
//
this.listBox1.FormattingEnabled = true;
this.listBox1.Items.AddRange(new object[] {
"LinkLabel",
"RadioButton",
"Label",
"TextBox"});
this.listBox1.Location = new System.Drawing.Point(12, 237);
this.listBox1.Name = "listBox1";
this.listBox1.Size = new System.Drawing.Size(175, 56);
this.listBox1.TabIndex = 6;
//
// label4
//
this.label4.AutoSize = true;
this.label4.Location = new System.Drawing.Point(12, 107);
this.label4.Name = "label4";
this.label4.Size = new System.Drawing.Size(337, 13);
this.label4.TabIndex = 12;
this.label4.Text = "Какой элемент используется в качестве индикатора процесса? ";
//
// radioButton1
//
this.radioButton1.AutoSize = true;
this.radioButton1.Location = new System.Drawing.Point(15, 123);
this.radioButton1.Name = "radioButton1";
this.radioButton1.Size = new System.Drawing.Size(51, 17);
this.radioButton1.TabIndex = 13;
this.radioButton1.TabStop = true;
this.radioButton1.Text = "Label";
this.radioButton1.UseVisualStyleBackColor = true;
//
// radioButton2
//
this.radioButton2.AutoSize = true;
this.radioButton2.Location = new System.Drawing.Point(15, 146);
this.radioButton2.Name = "radioButton2";
this.radioButton2.Size = new System.Drawing.Size(71, 17);
this.radioButton2.TabIndex = 14;
this.radioButton2.TabStop = true;
this.radioButton2.Text = "LinkLabel";
this.radioButton2.UseVisualStyleBackColor = true;
//
// radioButton3
//
this.radioButton3.AutoSize = true;
this.radioButton3.Location = new System.Drawing.Point(15, 169);
this.radioButton3.Name = "radioButton3";
this.radioButton3.Size = new System.Drawing.Size(56, 17);
this.radioButton3.TabIndex = 15;
this.radioButton3.TabStop = true;
this.radioButton3.Text = "Button";
this.radioButton3.UseVisualStyleBackColor = true;
//
// radioButton4
//
this.radioButton4.AutoSize = true;
this.radioButton4.Location = new System.Drawing.Point(15, 192);
this.radioButton4.Name = "radioButton4";
this.radioButton4.Size = new System.Drawing.Size(82, 17);
this.radioButton4.TabIndex = 16;
this.radioButton4.TabStop = true;
this.radioButton4.Text = "ProgressBar";
this.radioButton4.UseVisualStyleBackColor = true;
//
// label5
//
this.label5.AutoSize = true;
this.label5.Location = new System.Drawing.Point(12, 221);
this.label5.Name = "label5";
this.label5.Size = new System.Drawing.Size(396, 13);
this.label5.TabIndex = 17;
this.label5.Text = "Какой элемент используется для отображения гиперссылки для Интернет?";
//
// button2
//
this.button2.Location = new System.Drawing.Point(93, 342);
this.button2.Name = "button2";
this.button2.Size = new System.Drawing.Size(75, 23);
this.button2.TabIndex = 1;
this.button2.Text = "Cancel";
this.button2.UseVisualStyleBackColor = true;
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(109, 308);
this.textBox1.Name = "textBox1";
this.textBox1.Size = new System.Drawing.Size(100, 20);
this.textBox1.TabIndex = 4;
//
// label2
//
this.label2.AutoSize = true;
this.label2.Location = new System.Drawing.Point(12, 308);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(91, 13);
this.label2.TabIndex = 8;
this.label2.Text = "Введи свое имя:";
//
// Form1
//
this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
this.ClientSize = new System.Drawing.Size(486, 377);
this.Controls.Add(this.label5);
this.Controls.Add(this.radioButton4);
this.Controls.Add(this.radioButton3);
this.Controls.Add(this.radioButton2);
this.Controls.Add(this.radioButton1);
this.Controls.Add(this.label4);
this.Controls.Add(this.label2);
this.Controls.Add(this.listBox1);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.label1);
this.Controls.Add(this.checkedListBox1);
this.Controls.Add(this.button2);
this.Controls.Add(this.button1);
this.Name = "Form1";
this.Text = "Тест";
this.ResumeLayout(false);
this.PerformLayout();
}
#endregion
ЯЗЫК ПРОГРАММИРОВАНИЯ С#
Обзор языка С#
Андерс Хиджисберг, который возглавил в Microsoft работу по созданию языка С#, следующим образом определил стоявшие перед ними цели:
- создать первый компонентно-ориентированный язык программирования семейства C/C++;
- создать объектно-ориентированный язык, в котором любая сущность
представляется объектом;
- упростить C++, сохранив его мощь и основные конструкции.
Главное новшество связано с заявленной компонентной ориентированностью языка. Компоненты позволяют решать проблему модульного построения приложений на новом уровне. Построение компонентов обычно определяется не только языком, но и платформой, на которой этот язык реализован.
Главное в языке С# — реализация принципов объектно-ориентированного программирования. Объектно-ориентированная методика неотделима от С#, и все С#-программы в какой-то степени имеют объектную ориентацию. Поэтому, прежде чем приступать к написанию даже простой программы, необходимо понять основные принципы ООП.
ООП — это мощный "рычаг", позволяющий усовершенствовать процесс программирования. С момента изобретения компьютера методы программирования менялись
много раз и причем коренным образом, но в основном, с целью адаптации к непрерывному повышению сложности программ.
Объектно-ориентированное программирование вобрало в себя лучшие идеи структурного программирования и объединило их с новыми концепциями. В результате появился более совершенный способ организации программы. Программу можно организовать одним из двух способов: опираясь либо на код (т.е. на действия, или на то, что происходит в программе), либо на данные (т.е.на то, что подвергается определенному воздействию). При использовании исключительно методов структурного программирования программы обычно организовывались с опорой на действия. Такой подход можно представить себе в виде кода, воздействующего на данные.
Объектно-ориентированные программы работают совсем по-другому. Они организованы вокруг данных, а ключевой принцип такой организации гласит: именно данные должны управлять доступом к коду. В объектно-ориентированном языке программист определяет данные и код, который разрешен для выполнения действий над этими данными. Таким образом, тип данных точно определяет операции, которые могут быть к ним применены. Для поддержки принципов объектно-ориентированного программирования все ООП-языки, включая С#, имеют три характерных черты: инкапсуляцию, полиморфизм и наследование.
Сравнение языков С# и С++
Ниже приведены основные отличия языка C# от его основного прародителя языка C++.
Указатели и управление памятью
В языке C++ работа с указателями занимает одно из центральных мест.
Нормальный стиль программирования на С# предполагает написание безопасного кода, а это значит — никаких указателей, никакой адресной арифметики, никакого управления распределением памяти. Возможность работы с указателями в духе C++ ограничена небезопасными блоками.
Небезопасный код для С#-программистов будет скорее исключением, чем правилом. Это позволит меньше отвлекаться на отслеживание корректности работы программы с памятью, уделяя больше внимания функциональной части программы.
Наследование и шаблоны
В языке С# не реализованы такие важные для C++ моменты, как множественное наследование и шаблоны. Множественное наследование в С# возможно только для интерфейсов.
Типы данных
В языке С# появилась принципиально новая классификация типов, подразделяющая типы на значимые и ссылочные. Как следствие, применяются разные способы работы с объектами этих типов. В языке устранена разница между переменными и объектами. Все переменные в С# — тоже объекты, которые имеют единого предка — класс System.Object.
Структуры
В языке C++ структуры подобны классу, за небольшими исключениями. В С# разница между структурой и классом более существенна: структуры не могут иметь наследников, классы относятся к ссылочным типам, а структуры — к значимым.
Массивы
В языке С# имеется возможность как объявлять классические массивы, так и работать с массивами при помощи встроенных классов. Работа с массивами в С# более безопасна, поскольку выход за границы массива контролируется (при условии использования безопасного кода).
Классы
Следует отметить различия в подходах к сокрытию свойств класса. В C++ такое понятие, как свойство, вообще отсутствовало. В С# введены процедуры-свойства get и set, аналогичные тому, как это сделано в языке VB. Синтаксис обращения к свойствам класса в С# аналогичен синтаксису обращения к данным.
Синтаксические и семантические детали
В С# оператор switch не требует задания break для прерывания операции. Булевы переменные в языке С# имеют два значения, вместо них нельзя использовать целочисленные переменные, как это принято в C++.
В С# точка используется всюду, где в C++ применяются три разных сим-
вола— ".", "::", "->".__
ТИПЫ ДАННЫХ
Типы данных принято разделять на простые и сложные в зависимости от того, как устроены их данные. У простых (скалярных) типов возможные значения данных едины и неделимы. Сложные типы характеризуются способом структуризации данных - одно значение сложного типа состоит из множества значений данных, организующих сложный тип.
Есть и другие критерии классификации типов. Так, типы разделяются на встроенные типы и типы, определенные программистом (пользователем). Встроенные типы изначально принадлежат языку программирования и составляют его базис. В основе системы типов любого языка программирования всегда лежит базисная система типов, встроенных в язык. На их основе программист может строить собственные, им самим определенные типы данных.
Типы данных разделяются также на статические и динамические. Для данных статического типа память отводится в момент объявления, требуемый размер данных (памяти) известен при их объявлении. Для данных динамического типа размер данных в момент объявления обычно неизвестен и память им выделяется динамически по запросу в процессе выполнения программы.
Еще одна важная классификация типов - это их деление на значимые и ссылочные. Для значимых типов значение переменной (объекта) является неотъемлемой собственностью переменной (точнее, собственностью является память, отводимая значению, а само значение может изменяться). Для ссылочных типов значением служит ссылка на некоторый объект в памяти, расположенный обычно в динамической памяти - "куче".
Далее приведен перечень всех встроенных типов языка C# и их основные характеристики.
Логический тип
Имя типа |
Системный тип |
Значения |
Размер |
Bool |
System.Boolean |
true, false |
8 бит |
Арифметические целочисленные типы
Имя типа |
Системный тип |
Диапазон |
Размер |
Sbyte |
System.SByte |
-128 — 127 |
Знаковое, 8 Бит |
Byte |
System.Byte |
0 — 255 |
Беззнаковое, 8 Бит |
Short |
System.Short |
-32768 —32767 |
Знаковое, 16 Бит |
Ushort |
System.UShort |
0 — 65535 |
Беззнаковое, 16 Бит |
Int |
System.Int32 |
≈(-2*10^9 — 2*10^9) |
Знаковое, 32 Бит |
Uint |
System.UInt32 |
≈(0 — 4*10^9) |
Беззнаковое, 32 Бит |
Long |
System.Int64 |
≈(-9*10^18 — 9*10^18) |
Знаковое, 64 Бит |
Ulong |
System.UInt64 |
≈(0— 18*10^18) |
Беззнаковое, 64 Бит |
Арифметический тип с плавающей точкой
Имя типа |
Системный тип |
Диапазон |
Точность |
Float |
System.Single |
+1.5*10^-45 - +3.4*10^38 |
7 цифр |
Double |
System.Double |
+5.0*10^-324 - +1.7*10^308 |
15-16 цифр |
Арифметический тип с фиксированной точкой
Имя типа |
Системный тип |
Диапазон |
Точность |
Decimal |
System.Decimal |
+1.0*10^-28 - +7.9*10^28 |
28-29 значащих цифр |
Символьные типы
Имя типа |
Системный тип |
Диапазон |
Точность |
Char |
System.Char |
U+0000 - U+ffff |
16 бит Unicode символ |
String |
System.String |
|
Строка из символов Unicode |
Объектный тип
Имя типа |
Системный тип |
Примечание |
Object |
System.Object |
Прародитель всех встроенных и пользовательских типов |
Рассмотрим пример объявления переменных и присваивания им значений:
int x=11;
int v = new Int32();
v = 007;
string s1 = "Agent";
s1 = s1 + v.ToString() +x.ToString();
В этом примере переменная x объявляется как обычная переменная типа int. В то же время для объявления переменной v того же типа int используется стиль, принятый для объектов. В объявлении применяется конструкция new и вызов конструктора класса. В операторе присваивания, записанном в последней строке фрагмента, для обеих переменных вызывается метод ToString, как это делается при работе с объектами. Этот метод, наследуемый от родительского класса Object, переопределенный в классе int, возвращает строку с записью целого.
Рассмотрим еще один тип данных – структуру. Синтаксис объявления структуры аналогичен синтаксису объявления класса:
[атрибуты][модификаторы]struct имя_структуры[:список_интерфейсов]
{тело_структуры}
Все, что может быть вложено в тело класса, может быть вложено и в тело структуры: поля, методы, конструкторы и прочее, включая классы и интерфейсы. Аналогично классу, структура может иметь статические и не статические поля и методы, может иметь несколько конструкторов, в том числе статические и закрытые конструкторы. Для структур можно создавать собственные константы, используя поля с атрибутом readonly и статический конструктор. Структуры похожи на классы по своему описанию и ведут себя сходным образом, хотя и имеют существенные различия в семантике присваивания.
Но по сравнению с классами, структуры имеют существенные ограничения.
1) Самое серьезное ограничение связано с ограничением наследования, т.е. у структуры не может быть наследников, не может быть задан родительский класс или родительская структура.
2) Второе серьезное ограничение связано с процессом создания объектов. Пусть T - структура, и дано объявление без инициализации - T x. Это объявление корректно, в результате будет создан объект без явного вызова операции new. Сущности x будет отведена память, и на этой памяти будет развернут объект. Но поля объекта не будут инициализированы и, следовательно, не будут доступны для использования в вычислениях. Об этих особенностях подробно говорилось при рассмотрении значимых типов. В этом отношении все, что верно для типа int, верно и для всех структур.