Читаем Язык программирования C#9 и платформа .NET5 полностью

Несмотря на то что в структурах можно было бы создать вспомогательные методы (наподобие Rectangle.ToSquare), язык C# позволяет строить специальные процедуры преобразования, которые дают типам возможность реагировать на операцию приведения . Следовательно, если корректно сконфигурировать структуры, тогда для явного преобразования между ними можно будет применять такой синтаксис:


// Преобразовать Rectangle в Square!

Rectangle rect = new Rectangle

{

  Width = 3;

  Height = 10;

}

Square sq = (Square)rect;

Создание специальных процедур преобразования

Начните с создания нового проекта консольного приложения по имени CustomConversions. В языке C# предусмотрены два ключевых слова, explicit и implicit, которые можно использовать для управления тем, как типы должны реагировать на попытку преобразования. Предположим, что есть следующие определения структур:


using System;

namespace CustomConversions

{

  public struct Rectangle

  {

    public int Width {get; set;}

    public int Height {get; set;}


    public Rectangle(int w, int h)

    {

      Width = w;

      Height = h;

    }


    public void Draw

    {

      for (int i = 0; i < Height; i++)

      {

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

        {

          Console.Write("*");

        }

        Console.WriteLine;

      }

    }


    public override string ToString

      => $"[Width = {Width}; Height = {Height}]";

  }

}


using System;


namespace CustomConversions

{

  public struct Square

  {

    public int Length {get; set;}

    public Square(int l) : this

    {

      Length = l;

    }

  public void Draw

    {

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

      {

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

        {

          Console.Write("*");

        }

        Console.WriteLine;

      }

    }


    public override string ToString => $"[Length = {Length}]";


    // Rectangle можно явно преобразовывать в Square.

    public static explicit operator Square(Rectangle r)

    {

      Square s = new Square {Length = r.Height};

      return s;

    }

  }

}


Обратите внимание, что в текущей версии типа Square определена явная операция преобразования. Подобно перегрузке операций процедуры преобразования используют ключевое слово operator в сочетании с ключевым словом explicit или implicit и должны быть определены как static. Входным параметром является сущность, из которой выполняется преобразование, а типом операции — сущность, в которую производится преобразование.

В данном случае предположение заключается в том, что квадрат (будучи геометрической фигурой с четырьмя сторонами равной длины) может быть получен из высоты прямоугольника. Таким образом, вот как преобразовать Rectangle в Square:


using System;

using CustomConversions;


Console.WriteLine("***** Fun with Conversions *****\n");

// Создать экземпляр Rectangle.

Rectangle r = new Rectangle(15, 4);

Console.WriteLine(r.ToString);

r.Draw;


Console.WriteLine;


// Преобразовать r в Square на основе высоты Rectangle.

Square s = (Square)r;

Console.WriteLine(s.ToString);

s.Draw;

Console.ReadLine;


Ниже показан вывод:


***** Fun with Conversions *****

[Width = 15; Height = 4]

***************

***************

***************

***************

[Length = 4]

****

****

****

****


Хотя преобразование Rectangle в Square в пределах той же самой области действия может быть не особенно полезным, взгляните на следующий метод, который спроектирован для приема параметров типа Square:


// Этот метод требует параметр типа Square.

static void DrawSquare(Square sq)

{

  Console.WriteLine(sq.ToString);

  sq.Draw;

}


Перейти на страницу:

Похожие книги

Программирование. Принципы и практика использования C++ Исправленное издание
Программирование. Принципы и практика использования C++ Исправленное издание

Специальное издание самой читаемой и содержащей наиболее достоверные сведения книги по C++. Книга написана Бьярне Страуструпом — автором языка программирования C++ — и является каноническим изложением возможностей этого языка. Помимо подробного описания собственно языка, на страницах книги вы найдете доказавшие свою эффективность подходы к решению разнообразных задач проектирования и программирования. Многочисленные примеры демонстрируют как хороший стиль программирования на С-совместимом ядре C++, так и современный -ориентированный подход к созданию программных продуктов. Третье издание бестселлера было существенно переработано автором. Результатом этой переработки стала большая доступность книги для новичков. В то же время, текст обогатился сведениями и методиками программирования, которые могут оказаться полезными даже для многоопытных специалистов по C++. Не обойдены вниманием и нововведения языка: стандартная библиотека шаблонов (STL), пространства имен (namespaces), механизм идентификации типов во время выполнения (RTTI), явные приведения типов (cast-операторы) и другие. Настоящее специальное издание отличается от третьего добавлением двух новых приложений (посвященных локализации и безопасной обработке исключений средствами стандартной библиотеки), довольно многочисленными уточнениями в остальном тексте, а также исправлением множества опечаток. Книга адресована программистам, использующим в своей повседневной работе C++. Она также будет полезна преподавателям, студентам и всем, кто хочет ознакомиться с описанием языка «из первых рук».

Бьёрн Страуструп , Ирина Сергеевна Козлова , Бьерн Страуструп , Валерий Федорович Альмухаметов

Программирование, программы, базы данных / Базы данных / Программирование / Учебная и научная литература / Образование и наука / Книги по IT
97 этюдов для архитекторов программных систем
97 этюдов для архитекторов программных систем

Успешная карьера архитектора программного обеспечения требует хорошего владения как технической, так и деловой сторонами вопросов, связанных с проектированием архитектуры. В этой необычной книге ведущие архитекторы ПО со всего света обсуждают важные принципы разработки, выходящие далеко за пределы чисто технических вопросов.?Архитектор ПО выполняет роль посредника между командой разработчиков и бизнес-руководством компании, поэтому чтобы добиться успеха в этой профессии, необходимо не только овладеть различными технологиями, но и обеспечить работу над проектом в соответствии с бизнес-целями. В книге более 50 архитекторов рассказывают о том, что считают самым важным в своей работе, дают советы, как организовать общение с другими участниками проекта, как снизить сложность архитектуры, как оказывать поддержку разработчикам. Они щедро делятся множеством полезных идей и приемов, которые вынесли из своего многолетнего опыта. Авторы надеются, что книга станет источником вдохновения и руководством к действию для многих профессиональных программистов.

Нил Форд , Билл де Ора , Майкл Хайгард

Программирование, программы, базы данных / Базы данных / Программирование / Книги по IT