Исследование MS Visual С#

Страницы работы

Содержание работы

Исследуем C#

Сначала исследуем тип проекта, который рекомендуют профессионалы (Чарльз Петцольд). Это консольное приложение, но оно может создавать Windows-окна! Здесь мы попытаемся быстро войти в курс дела.

1.  В меню File4New выберите команду Blank solution.

2.  В появившемся окне диалога New Project, в окне Project Type раскройте узел дерева под именем Visual Studio Solution. В окне Templates выбор единственный — Blank solution.

3.  В окне Name оставьте имя решения Solution1.

4.  В окне Location задайте местоположение новой папки с файлами решения (solution).

5.  Нажмите OK.

Теперь вставьте в пустое рабочее пространство (или решение) пустой проект.

6.  В меню File4New выберите команду Project.

7.  В окне диалога New Project установите флажок Add to Solution и раскройте узел дерева под именем Visual C# Projects в окне Project Type.

8.  В окне Templates выберите тип проекта Empty Project.

9.  В окне Name задайте имя проекта ConsoleWnd.

10.  Нажмите OK.

Далее в пустой проект следует вставить пустой файл.

11.  В контекстном меню проекта (установите мышь над строкой ConsoleWnd) выберите Add4Add New Item. Далее ищите Code4Code File.

12.  В окне Name задайте имя файла ConsoleWnd.cs.

13.  Нажмите OK.

Введите в новый пустой файл минимально возможный код:

class A

{

static void Main()  // Нет глобальных функций! Все попрятались по домам

{

  System.Console.WriteLine ("Hello! This is C# Console Project");

}

}

Запустите (Ctrl+F5). Убедитесь в том, что все работает и исследуйте новые типы данных. Убедитесь, что все классы и структуры имеют неявного родителя (происходят от класса Object). Для этого, вместо предыдущего фрагмента вставьте что-нибудь вроде:

using System;

class A

{

static void Main()

{

  bool b = false;

  Type t = b.GetType();

  Console.WriteLine (t);

   Console.WriteLine (t.Assembly.FullName);

  Console.WriteLine ("\nIsPrimitive = {0}, IsPointer = {1}, " +

     "\nIsValueType = {2}, IsSubclassOf (Object) = {3}\n",

     t.IsPrimitive, t.IsPointer, t.IsValueType,

     t.IsSubclassOf (typeof(Object)));

  Console.WriteLine ("\nNew Types:\n\n" +

     "uint = (" + uint.MinValue + ", " + uint.MaxValue + ")\n\n" +

     "ulong = ({0}, {1})\n", ulong.MinValue, ulong.MaxValue);

  Console.WriteLine ("decimal = ({0}, {1})\n",

     decimal.MinValue, decimal.MaxValue);

  decimal d = 100.25m;

  Console.WriteLine ("\nSuffix 'm' stands for money: " + d +'\n');

}

}

Обратите внимание на различные способы соединения строк (и одиночных символов) при формировании текста для вывода в консольное окно. Методы Write и WriteLine класса Console используют семантику старой функции printf, но они позволяют еще более гибко управлять потоком вывода и форматировать числовые данные.

Самостоятельно опробуйте форматы вывода числовых данных. Для этого вместо {0} или {1} попробуйте вставить что-то вроде: {0:X8} или {1:C} или {1:C1}. Пользуйтесь Help. Действуют следующие спецификаторы формата: C — currency, D — decimal, E — exponent, F — fixed, G — general, N — number, P — percent, X — hexadecimal.

Совет. Сейчас мы двинемся дальше. Если вы хотите сохранить старый вариант кода, пожалуйста, не комментируйте его (будет много мусора, в котором ни вы, ни я не разберемся. Лучше присоедините к проекту новый файл (Wnd1.cs, Wnd2.cs, ...), скопируйте в него старый вариант, а старый файл (Wnd.cs) отсоедините, выбрав в контекстном меню файла команду: Exclude From Project.

Задание

¨  Добавьте в класс A метод, который обменивает местами значения двух переменных (одного из новых типов). Для этого вам придется передавать переменные по ссылке (это делается с помощью ключевого слова ref). Проверьте работу метода, вызвав его в функции Main.

Заметьте, что функция Main обязана быть static для того, чтобы Windows смогла ее запустить. Для вызова нестатического метода класса А внутри статического метода всегда необходимо сначала создать объект класса А. Сделайте это. После этого вызов метода Swap должен иметь вид: a.Swap (,); а не Swap (,);. Последнее было бы правильно, если бы Main была не static.

¨  Содайте массив вещественных ar и выведите его с помощью цикла foreach, форматируя как показано. Например:

 foreach (float f in ar)

Console.WriteLine ("{0:E2}", f);

¨  Создайте бесконечный цикл ввода, который просит пользователя вводить строку текста (string s) и выводит ответную строку ans. Используйте switch для текстовой строки!!! Это было невозможно в С++. Погрузите в цикл какой-нибудь бред, например:

switch (s.ToUpper()) // Приводим к верхнему регистру

{

case "I":

    ans = "My";   break;

  case "YOU":

     ans = "Your"; break;

  case "HE":

     ans = "His";  break;

  case "Q":

     ans = "Leaving"; break;

  default:

     ans = "Enter a pronoun, please!"; break;

}

Console.WriteLine (ans);

if (ans == "Leaving")

  break;

Создаем Windows-окна

Для того, чтобы в консольном приложении создать Windows-окно, надо подключить DLL.

1.  В контекстном меню проекта выберите Add Reference.

2.  В окне диалога Add Reference, выберите три библиотеки System.dll, System.Windows.Forms и System.Drawing.

3.  Замените весь код файла.

using System;

using System.Windows.Forms;

class A

{

static void Main()

{

  Console.WriteLine("I am ready to serve you");

  Form form = new Form();

  form.Text = "My Window";

  form.Visible = true;

  Console.WriteLine("The window width = " + form.Width);

}

}

Запустите приложение и попробуйте объяснить его поведение.

Консольное приложение не создает бесконечного цикла ожидания и обработки сообщений. Поэтому оно сразу завершатся. Оно не ждет реакции пользователя, так как нет цикла типа while (GetMessage(. . .)).

Для того, чтобы задержать окно на экране, вставьте в конец функции Main такую строку кода.

MessageBox.Show("App has ended");

Запустите и попробуйте объяснить. Для того, чтобы запустить нормальный цикл ожидания и обработки сообщений нужен класс Application. Он может создать цикл и связать его с Windows-окном. Класс Application имеет только статические методы. Их следует вызывать, не создавая объект класса, например, Application.DoEvents(). Вставьте в функцию Main (перед строкой с вызовом MessageBox) такую строку кода.

Application.Run();

Запустите и попробуйте объяснить. Приложение повисает. Почему?

Объяснение. Так как приложение не связано с окном, то окно не посылает ему сообщение WM_QUIT и бесконечный цикл обработки сообщений не прерывается. Вспомните PostQuitMessage в API-программе — оконная процедура посылала его приложению. В нашем случае для завершения приложения можно нажать Ctrl+С. Это преимущество дает консольный тип проекта. Windows-приложение пришлось бы убивать с помощью Task Manager. Далее, замените Application.Run() на:

Похожие материалы

Информация о работе