Модификация консольного приложения



 

Для начала произведём небольшую настройку среды разработки для большего удобства прочтения исходного кода. Для этого выполним Сервис -> Параметры… -> Текстовый редактор -> C # -> Показывать: Номера строк.

Теперь слева в окне исходного кода отображаются номера строк для кода C#:

 

Рис. 3. 1. Отображение номера строки

 

Теперь модифицируем исходный код. Наиболее простая модификация, это вывод какой-либо фразы в консольном приложении. Сделаем это:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LWP01Console

{

class Program

{

   static void Main(string[] args)

   {

       Console.WriteLine("Hello World!\nИ по-русски можно? Конечно, привет мир!\nThis is my first application using C#!");

       Console.ReadKey();

   }

}

}

 

Мы добавили всего три строчки:

 

       Console.WriteLine("Hello World!\nИ по-русски можно? Конечно, привет мир!\nThis is my first application using C#!");

       Console.ReadKey();

       Console.Clear();

 

Скомпилируем это приложение, в результате увидим следующее (Рис. 3. 2.):

 

Рис. 3. 2. Модифицированное консольное приложение

 

Теперь усложним приложение, добавив следующий исходный код:

 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

 

namespace LWP01Console

{

class Program

{

   static void Main(string[] args)

   {

       Console.WriteLine("Hello World!\nИ по-русски можно? Конечно, привет мир!\nThis is my first application using C#!");

       Console.ReadKey();

       Console.Clear();

       //

       Console.WriteLine("Пожалуйста, введите символы:\n");

       String a;

       a = Console.ReadLine();

       Console.WriteLine("\n\tВы ввели символ: " + a + ".");

       Console.ReadKey();

       Console.Clear();

       //

       Console.WriteLine("Пожалуйста, введите число элементов массива:\n");

       int x = Convert.ToInt32(Console.ReadLine());

       Console.WriteLine("\nПожалуйста, введите элемент массива:\n");

       string[] m1 = new string[x];

       int i;

 

       for (i = 0; i < m1.GetLength(0); i++)

       {

           Console.Write("Элемент {" + i + "}: ");

           m1[i] = Console.ReadLine();

       }

       Console.WriteLine("\n\tВаш массив:");

 

       for (i = 0; i < m1.GetLength(0); i++)

       {

           Console.Write("\t" + m1[i]);

           Console.WriteLine();

       }

       Console.ReadKey();

   }

}

}

 

Скомпилируем его и проверим работоспособность. Теперь поясним исходный код. Для удобства, исходный код поделим на части символом комментариев (//).

 

Теперь программа выполняет три итерации. Первая итерация сначала выводит строку (Рис. 3. 2.). Вторая итерация предлагает нам ввести эту строку самим, затем выводит её на экран. И третья итерация позволяет нам ввести число элементов одномерного массива, заполнить его и тоже вывести на экран. После каждой итерации экран очищается.

 

Рис. 3. 3. Результат работы третьей итерации работы консольного приложения

 

Поясним исходный код к каждой итерации. Ключевые слова подсвечены синим.  В самом начале кода мы видим следующую строку:

 

using System;

 

Библиотеки классов .NET Framework образуют иерархическую структуру пространств имён (namespaces). Это может привести к довольно длинным именам, если требуемый класс или тип имеет очень большую глубину вложения. Чтобы сократить ввод длинных имён, в C# введена директива using. Посмотрим работу этой директивы на примере. В нашем приложении есть такая строка:

 

Console.WriteLine("Hello World!\nИ по-русски можно? Конечно, привет мир!\nThis is my first application using C#!");

 

Если бы изначально мы не подключали ссылки, эта строка выглядела бы так:

 

System.Console.WriteLine("Hello World!\nИ по-русски можно? Конечно, привет мир!\nThis is my first application using C#!");

 

Ввод такого текста несложен, а представим, что у нас большое приложение с обширным набором типов и классов. Директива using позволяет компилятору найти непонятный ему элемент, просматривая указанное пространство имен. В данной работе директива using используется так:

 

using System;

namespace LWP01Console

{

class Program

{

   static void Main(string[] args)

   {

       Console.WriteLine("Hello World!\nИ по-русски можно? Конечно, привет мир!\nThis is my first application using C#!");

 

В ходе синтаксического анализа метода Console . WriteLine компилятор установит, что этот метод не описан. Поэтому он примется просматривать пространства имён, заданные директивой using, и, найдя описание метода в пространстве имён System, завершит компиляцию кода без ошибок.

 

И так, директива using это зарезервированное слово в языке Си-шарп. Она используется в двух случаях:

 

· разрешает использование типов в пространстве имён, поэтому уточнение использования типа в этом пространстве имён не требуется: using System.Text;

· позволяет создавать псевдонимы пространства имен или типа. Это называется директива using alias и выглядит примерно так: using Project = PC . MyCompany . Project ;

 

Ключевое слово using также используется для создания операторов using, которые обеспечивают правильную обработку объектов IDisposable, например файлов и шрифтов.

 

Как видим, также как и в C и C ++ язык унаследовал символ «;» (точка с запятой) как символ разделения операторов, однако можно писать код и без этого разделителя (частично).

 

Директива using применима к пространствам имён, но не к классам. В нашем примере System является пространством имён, Console — классом, a WriteLine — статическим методом класса Console. Поэтому такой код неверен:

 

using System.Console; // Нельзя использовать директиву using по отношению к классу

//...

namespace LWP01Console

{

class Program

{

   static void Main(string[] args)

   {

       WriteLine("Hello World!\nИ по-русски можно? Конечно, привет мир!\nThis is my first application using C#!");

 

Указывать класс в директиве using нельзя, но существует вариант директивы using, позволяющий создать псевдоним для класса:

 

using <псевдоним> = <класс>;

 

Благодаря этой форме директивы using можно написать подобный код:

 

using Console2011 = System.Console;

//...

class Program

{

   static void Main(string[] args)

   {

       Console2011.WriteLine("Hello World!\nИ по-русски можно? Конечно, привет мир!\nThis is my first application using C#!");

 

Немного об универсальном программировании:

 

Описание класса в С# должно содержать встроенное (inline) описание всех методов — в этом языке заголовочных файлов не бывает (в отличие например от C и C++). Благодаря этому правилу разработчики классов могут создавать высоко мобильный код, что является одной из ключевых концепций среды .NET. Создавая Си-шарп-класс, в конце концов, разработчик имеет полностью инкапсулированную связку функциональных возможностей, которую можно легко перенести в любую среду разработки, и ему не нужно беспокоиться, как в другом языке обрабатываются включаемые файлы, и существует ли в нём вообще механизм включения файлов. Такой подход — универсальное программирование («one-stop programming») — позволяет, например, перебросить весь класс на страницу ASP (Active Server Pages), и он будет функционировать так, будто был скомпилирован для обычного приложения.

 

namespace LWP01Console

{

class Program

 

Здесь мы видим имя класса и пространства имён. Автоматически (при создании консольного приложения средой разработки) было выбрано пространство имён LWP 01 Console, и имя класса, который описывает проблемную область. В нашем случае это Program.Начало и окончание описания класса отмечается фигурными скобками — открывающей «{» и закрывающей «}» соответственно. Всё, что внутри них, считается частью класса. Заметим: в нашем случае класс называется Program , а всё, что есть в приложении, описано в контексте этого класса.

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

 

Создание пространства имён указывается ключевым словом namespace. Объявляемые пространства имён могут использоваться для структурирования программы. Например:

 

namespace Name01.Name02

{

class A { }

}

 

namespace Name03

{

using Name01.Name02;

class B : A { }

}

 

Идём дальше по коду:

 

static void Main(string[] args)

 

Каждое приложение на C# должно иметь метод с именем Main (), описанный в одном из его классов. Не имеет значения, в каком классе находится этот метод: классов, может быть столько, сколько нужно для вашего приложения. Главное, чтобы в каком-нибудь классе был метод с именем Main. Кроме того, этот метод должен быть описан как открытый (public) и статический (static). Ключевое слово public является модификатором доступа, который сообщает компилятору Си-шарп, что этот метод может вызвать кто угодно. Ключевое слово static означает, что метод является глобальным и что для его вызова не требуется создавать экземпляр этого класса. Это очень важно, так как иначе компилятор не знал бы, как или когда создавать экземпляр вашего класса. Раз метод статический, компилятор сохранит адрес метода как точку входа, и среда .NET начнёт с него выполнение приложения.

 

Следующие строчки кода таковы:

 

Console.WriteLine("Hello World!\nИ по-русски можно? Конечно, привет мир!\nThis is my first application using C#!");

       Console.ReadKey();

       Console.Clear();

 

Если System — это пространство имён, Console — класс, определённый в этом пространстве, то метод, WriteLine1 — метод определённый в этом классе.

 

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

 

  • Read — чтение символов из потока ввода.
  • ReadLine — чтение строки символов из потока ввода.
  • Write — запись строки символов в поток вывода.
  • WriteLine — запись в поток вывода строки символа, ограниченной символами конца строки.

 

ReadKey — получает следующий нажаты пользователем символ или функциональную клавишу. Нажатая клавиша отображается в окне консоли. Используем этот метод для остановки выполнения консольного приложения (для отображения выполненных действий приложений).

 

Clear— удаляет из буфера консоли и её окна отображаемую информацию.

 

ПРИМЕЧАНИЕ № 1: Описания применяемых в данной работе методов также можно посмотреть, наведя курсор на нужное слово методе.

 

       //

       Console.WriteLine("Пожалуйста, введите символы:\n");

       String a;

       a = Console.ReadLine();

       Console.WriteLine("\n\tВы ввели символ: " + a + ".");

       Console.ReadKey();

       Console.Clear();

 

Двойной правый слеш — комментарии (зелёные). Также комментарии можно задавать так:

 

/* Текст комментария */

 

В остальном, здесь всё просто. Объявляем переменную «a» (строковая — String или string), выполняем считывание символов с клавиатуры (ReadLine) и выводим введённый символ в потоке с переводом строки. Конструкция «+ a +» служит для подстановки переменной «a» в поток символов для вывода в окне консольного приложения.

\ n определяется как перевод курсора на следующую строку.

\ t определяется как символ табуляции в окне консоли.

 

Последний участок кода (третья итерация):

 

       //

       Console.WriteLine("Пожалуйста, введите число элементов массива:\n");

       int x = Convert.ToInt32(Console.ReadLine());

       Console.WriteLine("\nПожалуйста, введите элемент массива:\n");

       string[] m1 = new string[x];

       int i;

 

       for (i = 0; i < m1.GetLength(0); i++)

       {

           Console.Write("Элемент {" + i + "}: ");

           m1[i] = Console.ReadLine();

       }

       Console.WriteLine("\n\tВаш массив:");

 

       for (i = 0; i < m1.GetLength(0); i++)

       {

           Console.Write("\t" + m1[i]);

           Console.WriteLine();

       }

       Console.ReadKey();

       Console.Clear();

 

Здесь идёт объявление переменной «x» и присваивание отконвертированного числа введённого с клавиатуры в int (32-битное число со знаком). Конвертирование производится методом Convert (преобразует значение одного базового типа данных к другому базовому типу данных), который использует ToInt 32 (преобразует заданное строковое представление числа в эквивалентное 32-разрядное знаковое целое число). Далее мы объявляем строковый одномерный массив (string []) где число элементов задаётся по числу в переменной «x» (индекс начинается с нуля) и в цикле (ключевая последовательность i < m 1. GetLength (0), где метод получает 32-разрядное целое число, представляющее количество элементов в заданном измерении массива — в нашем массиве одно измерение, которое мы пдоставляем в метод под цифрой «0»). В теле цикла мы последовательно вводим символы элемента массива (m 1[ i ]). Второй цикл делает обратную операцию6 выводит нш массив.

 

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

 

Во-первых, C# позволяет писать код свободно, но каждый оператор должен заканчивать точкой с запятой2. Также можно написать код приложения даже в одну строчку2.

 

Во-вторых, C# чувствителен к регистру. А это значит что «ConsolE», «Static» и «Public» могут вызвать ошибки. Также важно понимать, что это касается и переменных и операторов.

 

ПРИМЕЧАНИЕ № 2: Однако, не всегда точка с запятой обязана быть. Например, конструкция без точек с запятой ниже, выдаст сообщение с тремя кнопками. Вставим этот код, в наше консольное приложение предварительно добавив ссылку System . Windows . Forms (Рис. 3. 4.):

 

Рис. 3. 4. Добавление новой ссылки System . Windows . Forms

 

while (System.Windows.Forms.MessageBox.Show("Hello World without ';'! Привет мир без точек с запятой!", "This is My First Message Box!", System.Windows.Forms.MessageBoxButtons.YesNoCancel) != System.Windows.Forms.DialogResult.Yes){}

 

Рис. 3. 5. Результат работы кода без точек с запятой (нужно нажать «Да»)

 

Публикация

 

Наше приложение скомпилировано, прошло отладку и проверено на работоспособность. Оно готово к выпуску. Финальная стадия разработки начинается и заканчивается публикацией. Перед публикацией можно также позаботиться о безопасности приложения (актуально для Windows Forms и Windows Foundation Presentation). В частности вкладка свойств проекта LWP 01 Console Безопасность выглядит так:

 

Рис. 4. 1. Безопасность проекта

 

Немного о технологии ClickOnce:

 

ClickOnce — это технология разработанная корпорацией Microsoft для «развёртывания» приложений Windows Forms и Windows Foundation Presentation.

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

 

· сложность в обновлении развертываемого приложения;

· воздействие приложения на компьютер пользователя;

· необходимость административных полномочий для установки приложения.

 

ClickOnce-приложения изолированы друг от друга, и одно приложение не может повлиять на работу других.

 

Теперь перейдём к публикации (вкладка Публикация):

 

Рис. 4. 2. Публикация проекта

 

Есть два способа закончить публикацию. Ручной, с выбором всех необходимых параметров (Рис. 4. 2.) начиная от установки места публикации (веб-узел, ftp-сервер или путь к файлу), и заканчивая настройкой проверки обновлений у приложения и выбора место откуда «грабить» обновления для приложения. Полуавтоматический (упрощённый), который мы используем по нажатию кнопки Мастер публикаций….

 

Шаг 1 (выбор места публикации):

 

Рис. 4. 3. Мастер публикаций: Место публикации приложения

 

Шаг 2 (выбор способа установки приложения пользователем):

 

Рис. 4. 4. Мастер публикаций: Способ установки приложения пользователями

 

Шаг 3 (указание возможности обновления приложения):

 

Рис. 4. 5. Мастер публикаций: Место, где приложение будет искать обновления

 

Последний шаг:

 

Рис. 4. 6. Готов к публикации

 

То, что создалось после работы мастера публикаций в конечной директории публикации указанной в самом начале:

 

Рис. 4. 7. Файлы публикации (созданная директория D :\Проекты\ CS \ Application Files)

 

Рис. 4. 8. Файлы публикации (в конечной директории D :\Проекты\ CS)

 

Запускаем Setup.exe:

 

Рис. 4. 9. Установка нашего консольного приложения

 

Жмём Установить и приложение поселится (по умолчанию) на рабочем столе (ярлык), меню Пуск (ярлык), и его можно будет удалить как обычной приложение из панели управления.

 

Удаление установленного приложения:

 

Рис. 4. 10. Удаление установленного приложения (Панель управления -> Программы и компоненты)

 


Дата добавления: 2019-09-13; просмотров: 192; Мы поможем в написании вашей работы!

Поделиться с друзьями:






Мы поможем в написании ваших работ!