Разработка приложений на языке C#. Полезные настройки. Особые спецификаторы формата, страница 2

Предлагаю (точнее, настаиваю) вместо указанного сценария работы с файлами (подключи-отключи) использовать особый каркас приложения, в котором части класса Program разнесены по файлам (сколько примеров — столько и файлов). Он удобен тем, что одно решение демонстрирует всю вашу работу. По мере продвижения по курсу в проект будут добавляться новые классы, а в класс Program будут добавляться новые статические методы, иллюстрирующие конкретные средства языка C#. Чуть позже в пространство решений (Solution) мы добавим новый проект. В конце семестра вы должны иметь одно решение, состоящее из нескольких проектов. Это решение содержит всю работу за семестр.

Новые типы данных

Исследуем некоторые типы данных и убедимся, что все классы и структуры имеют неявного родителя (происходят от класса Object). Для этого, измените код файла Program.cs:

using System;

using System.Text;

namespace MyConsole

{

partial class Program

{

  public static void Main()

  {

    Console.BackgroundColor = ConsoleColor.DarkBlue;

    Console.ForegroundColor = ConsoleColor.Yellow;

    Console.WindowWidth = 110;

    Console.WindowHeight = 45;

    Console.Title = "MyConsole Application";

    Console.InputEncoding = Encoding.GetEncoding("windows-1251");

    while (true)

    {

      Console.Clear();

      switch (Menu())

      {

        case '\x1b':

           Console.Beep(800, 100);    Console.Beep(600, 100);    Console.Beep(400, 500);

           Console.Write("\a\a"); return;

        case 'q': return;

        case 't': TestTypes(); break;

      }

    }

  }

  public static char Menu()

  {

    Console.Write("\n\tSelect one of the methods:\n" + // Меню выбора действия

      "\n\tq (Esc) - Quit\n\tt - Types\n\n");

    return char.ToLower(Console.ReadKey(true).KeyChar); // Читаем символ

  }

}

Здесь вы видите способы управления классом Console c помощью его статических методов и свойств. О новой сущности языка (свойствах) мы поговорим позже, а суть вызываемых методов мне кажется очевидной. Кроме того, обратите внимание на ключевое слово partial, которое говорит о том, что класс Program будет иметь продолжение(я) в других файлах. Теперь добавьте в проект новый файл (команда Add New Item→Class контекстного меню проекта) с именем TestTypes.cs.

Измените содержимое файла, как показано ниже.

using System;

namespace MyConsole

{

partial class Program

{

  static void TestTypes()

  {

    Console.Clear();

    bool b = false;

    Type t = b.GetType();

    Console.WriteLine("\tValue and Reference Types\n" +

      "Assembly:\t" + t.Assembly.FullName +

      "\n\n" + t +

      ":\n\nPrimitive type \t\t{0}, \nPointer type \t\t{1}, " +

      "\nValue type \t\t{2}, \nSubclass of object \t{3}\n",

      t.IsPrimitive, t.IsPointer, t.IsValueType, t.IsSubclassOf(typeof(object)));

    t = typeof(Program);

    Console.WriteLine(t + ":\n\nPrimitive type \t\t{0}, \nPointer type \t\t{1}, " +

      "\nValue type \t\t{2}, \nReference type \t\t{3}, \nSubclass of object \t{3}\n",

      t.IsPrimitive, t.IsPointer, t.IsValueType, t.IsClass, t.IsSubclassOf(typeof(object)));

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

      "uint: \t(" + uint.MinValue + ", " + uint.MaxValue + ")\n" +

      "ulong: \t({0}, {1}) max: {2:e1} \ndecimal: ({3}, {4}) max: {5:e1}\n",

      ulong.MinValue, ulong.MaxValue, (double)ulong.MaxValue,

      decimal.MinValue, decimal.MaxValue, decimal.ToDouble(decimal.MaxValue));

    decimal d = 100.25m;

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

    float[] a = { 1, -1.25f, 1.03f, -1, 1e8f, -1e-2f, 5e6f }; // Массив переменных типа float

    Console.WriteLine("\n\nTest Formatting options\n");

    for (int i = 0; i < a.Length; i++)

      Console.Write("\n{0,12:f2}  ", a[i]);   // Здесь используется 12 позиций

    Console.WriteLine("\n\t\tPress any key to go to main menu\n");