English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Поделиться примером использования explicit и implicit в C#

Сегодня, когда яreviewел старый проект, я увидел странный код.

if (dto.Payment == null) continue;
var entity = entries.FirstOrDefault(e => e.LedgerEntryID == dto.LedgerEntryID);
dto.Payment = entity?.Payment;

其中 dto.Payment является экземпляром класса PaymentDTO, entity?.Payment является экземпляром класса Payment, классы PaymentDTO и Payment не имеют отношения «родитель-дочерь», поэтому не существует неявного преобразования между подклассом и родительским классом.

загадочно то, что компилятор Visual Studio не подсказал никаких ошибок компиляции

открыв определение класса PaymentDTO, я нашел следующий метод

public static implicit operator PaymentDTO(Payment payment)

по внешнему виду это переписанный оператор PaymentDTO, но это не те, которые я обычно использую (+, -, *, /, == и т.д.)

после исследования MSDN я понял, что implicit и explicit - это пара операторов преобразования

Implicit и Explicit

Implicit

Ключевое слово implicit используется для объявления имплицитных пользовательских операторов преобразования. Оно может реализовывать имплицитное преобразование между двумя различными классами, улучшая читаемость кода. Однако, следует помнить, что после использования оператора имплицитного преобразования в компиляции пропускается проверка исключений, поэтому оператор имплицитного преобразования не должен вызывать исключения и не должен терять информацию, в противном случае в runtime могут возникнуть некоторые неожиданные проблемы.

например, текущее определение PaymentDTO и Payment是这样的

public class Payment
  {
     public decimal Amount { get; set; }
  }
  public class PaymentDTO
  {
     public string AmountString { get; set; }
  }

если нужно преобразовать Payment в PaymentDTO имплицитно, достаточно声明 оператор имплицитного преобразования PaymentDTO

public class PaymentDTO
    {
      public string AmountString { get; set; }
public static implicit operator PaymentDTO(Payment payment)
      {
        return new PaymentDTO
        {
AmountString = payment.Amount.ToString("C2")
        };
      }
    }

при вызове достаточно просто присвоить значение

class Program
    {
      static void Main(string[] args)
      {
PaymentDTO dto = new Payment { Amount = 1 };
        Console.WriteLine(dto.AmountString);
        Console.Read();
      }
    }

Explicit

Ключевое слово explicit используется для объявления пользовательских операторов преобразования, которые должны быть вызываемы через преобразование. В отличии от имплицитного преобразования, эксплицитное преобразование оператор должно вызываться через преобразование, в противном случае в компиляции появится ошибка.

например, сейчас мы изменим оператор преобразования, определенный в классе PaymentDTO, с имплицитного на эксплицитный

public class PaymentDTO
    {
      public string AmountString { get; set; }
public static explicit operator PaymentDTO(Payment payment)
      {
        return new PaymentDTO
        {
AmountString = payment.Amount.ToString("C2")
        };
      }
    }

В этом случае, так как в методе Main нет явного преобразования, компилятор выдает ошибку, указывающую на то, что не может неявно преобразовать тип 'ExplicitImplicit.Payment' в 'ExplicitImplicit.PaymentDTO'. Существует явное преобразование (не упустили ли вы преобразование с помощью cast?).

Чтобы компилятор мог скомпилировать код, достаточно сделать один явный преобразование

class Program
    {
      static void Main(string[] args)
      {
PaymentDTO dto = (PaymentDTO)new Payment { Amount = 1 };
        Console.WriteLine(dto.AmountString);
        Console.Read();
      }
    }

Резюме

Implicit улучшает читаемость кода, но программисту нужно самим убедиться, что преобразование не вызывает исключений и не теряет информации

Explicit предотвращает вызовы компилятором беззвучных операций преобразования, которые могут привести к неожиданным последствиям

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

Вот полный список содержимого о使用了显式和隐式用法 в C#, пожалуйста, часто ссылайтесь на примеры при изучении, спасибо за поддержку руководства по крику.

Заявление: содержимое этой статьи взято из Интернета, авторские права принадлежат соответствующему автору, контент предоставлен пользователями Интернета, сайт не имеет права собственности, не был отредактирован вручную, и не несет ответственности за соответствующие юридические последствия. Если вы обнаружите контент,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (во время отправки письма замените # на @) для сообщения о нарушении,并提供 соответствующие доказательства. Если подтвердится, сайт немедленно удалят涉嫌侵权的内容。

Основной учебник
Рекомендуется для вас