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

             if (char.ToLower (s[i]) != char.ToLower (s[s.Length - i -1]))

                   return false;

      return true;

   }

Если нужны подсказки, то выделите их и нажмите Ctrl+Space. Для проверки воспользуйтесь услугами следующего программного фрагмента:

string[] ss = { "Dennis sinned", "Level", "Шалаш", "Собор", "Rotor" };

foreach (string s in ss)

  Console.WriteLine (s + ":\t" + MyString.IsPalindrome (s));

Проверьте работу метода на примере первого английского палиндрома (1614): "Lewd did I live & evil I did dwel". Сделайте скидку на особенность старого написания dwel (вместо современного dwell). В 19-м веке девизом некоторых адвокатов было изречение: "Si nummi immunis" ("Если заплатишь, освобожу"). Англичане перевели его так: "Give me my fee, and I warrant you free". Внесите изменения в метод IsPalindrome так, чтобы он причислил к стану палиндромов оригинальную версию высказывания (Подсказка: s = s.Replace (" ","");).

Для тех, кто любит указатели

Если вам кажется, что вас обделили, убрав указатели, то это—иллюзия, или вредные слухи. Чтобы создать неуправляемый код (или работать с неуправляемым heap), придется предупредить компилятор: установить в True флаг Project→PropertiesConfigurationPropertiesAllowUnsafeCodeBlocks. Затем надо создать unsafe-метод и вставить его в класс Program. В соответствии с правилами нашего каркаса файл TestUnsafe.cs должен выглядеть так. Вам надо вызвать метод TestUnsafe из метода Main().

using System;

namespace MyConsole

{

partial class Program

{

  static string test = "MS Educational "; // Переменная класса Program

  unsafe static void Display(char* text)  // Опасный  метод

  {

    for (int i = 0; text[i] != 0; ++i)

      Console.Write(text[i] + " ");

  }

  unsafe static void TestUnsafe() // Вызывающий метод тоже следует сделать опасным, так как внутри идет работа с указателем

  {

    Console.Clear();

    Console.WriteLine("\n\tTest Unsafe Code\n");

    char[] text = new char[] { 'C', 'e', 'n', 't', 'e', 'r', ' ' };

    fixed (char* p = test)

      Display(p);

    fixed (char* p = &text[0])

      Display(p);

    fixed (char* p = "Avalon.ru")

      Display(p);

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

    Console.ReadKey(true);

  }

}

}

Метод Display (неуправляемым способом) работает с управляемым объектом test класса string, вложенным в класс Program, затем он принимается за управляемый массив text, и на закуску съедает неуправляемый литерал (константу типа char*). Оператор fixed временно предотвращает перемещение управляемых объектов сборщиком мусора. Это—необходимая мера для работы неуправляемым способом с управляемыми объектами. Любопытные детали всплывают в режиме эксперимента (в методе Display замените " " на ' ' и сравните результаты). Второй эксперимент (замените в TestUnsafe &text[0] на text) показывает эквивалентность ссылок &text[0] и text. Задание. Измените код метода Display так, чтобы он работал исключительно с указателем text и не использовал индекс (i).

Следующий метод FloatInterior более изощренно работает с управляемым массивом. Здесь мы пытаемся близко рассмотреть внутреннее представление чисел в формате с плавающей точкой.

unsafe static void FloatInterior (float[] a)

{

  Console.WriteLine();

  fixed (float *pFix = a)  // Прикалываем к столу массив одной булавкой (чтобы не убежал)

  {

    float *p = pFix;         // Этой булавкой будем его ковырять (булавка подвижна)

    for (int i=0; i<a.Length; i++, p++) // Хотим увидеть байты числа в формате float

    {

      Console.Write("\n{0,12:f2}  at  {1} :  ", a[i], (int)p); // Элемент массива и его адрес

      byte *pb = (byte*)p + 4;   // Этой (тонкой) булавкой ковыряемся во внутренней структуре переменной типа float

      for (int j=0; j<4; j++)