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

C#でのExplicitとImplicitの使い方の例分享

今日、古いプロジェクトをレビューしている際に、奇妙なコードを見つけました。

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

そのdto.PaymentはPaymentDTOクラスのインスタンスです。63;.PaymentはPaymentクラスのインスタンスであり、PaymentDTOクラスとPaymentクラスは子クラスと親クラスの関係がないため、子クラスと親クラス間のイン implcit変換は存在しません}}

奇妙なことに、Visual Studioのコンパイラはコンパイルエラーを一切示しませんでした

PaymentDTOクラスの定義を開くと、以下のようなメソッドのシグネチャが見つかりました

public static implicit operator PaymentDTO(Payment payment)

メソッドのシグネチャから見ると、これはPaymentDTO型の演算子をオーバーライドしているように見えますが、私が以前に常用していたものとは異なります+,-,*,/、==など。

MSDNを参照して、イン implcitとExplicitが変換演算子のペアであることを知りました

イン implcitとExplicit

イン implcit

イン implcitキーワードは、ユーザー定義の型変換演算子を宣言するために使用されます。それにより、以下のようなことが実現できます2異なるクラス間のイン implcit変換を使用することで、コードの可読性を向上させることができます。ただし、イン implcit変換演算子を使用した場合、コンパイル時に例外チェックがスキップされるため、例外を引き起こさず、情報を失わないように演算子を宣言することが重要です。その場合、ランタイムで予期せぬ問題が発生する可能性があります。

例えば、現在のPaymentDTOとPaymentの定義は以下の通りです

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

PaymentをPaymentDTOにイン implcitに変換する必要がある場合、PaymentDTOのイン implcit変換演算子を宣言するだけで十分です

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

呼び出し時は直接代入するだけで十分です

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

Explicit

Explicitキーワードは、ユーザー定義の型変換演算子を呼び出すために変換を通じて宣言する必要があります。イン implcit変換とは異なり、明示的な変換演算子は変換を通じて呼び出す必要があります。明示的な変換が欠けている場合、コンパイル時にエラーが発生します。

例えば、今、前に定義したPaymentDTOクラスの変換演算子をImplicitからExplicitに変更しました

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

この時点でMainメソッドには明示的な変換がなく、コンパイラがエラーを返し、Cannot implicitly convert type 'ExplicitImplicit.Payment' to 'ExplicitImplicit.PaymentDTO'. An explicit conversion exists (are you missing a cast?)と表示します。63;)

コンパイラを通過させるために、明示的な変換を行うだけで十分です

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

まとめ

Implicitはコードの可読性を向上させますが、プログラマーは自分で変換が例外を引き起こさず、情報を失わないことを保証する必要があります。

Explicitは、コンパイラが予期せぬ結果を引き起こす可能性のある変換操作を静かに呼び出すことを阻止します。

前者は使いやすく、後者はコードを読むすべての人に明確にタイプの変換を示すことができます。

これで、私たちが皆さんに整理したC#でのExplicitとImplicitの使い方の全てが終わります。学習中は、例を多く参照してください。あなたの「叫び」教程へのサポートに感謝します。

声明:この記事の内容はインターネットから取得しており、著作権者はすべての権利を保有しています。インターネットユーザーが自発的に貢献し、自己でアップロードしたものであり、このサイトは所有権を持ちません。また、人工編集もなく、関連する法的責任も負いません。著作権侵害を疑われる内容がある場合は、以下のメールアドレスまでご連絡ください:notice#oldtoolbag.com(メールを送信する際には、#を@に置き換えてください。報告を行い、関連する証拠を提供してください。一旦確認が取れたら、このサイトは即座に侵害を疑われるコンテンツを削除します。)

おすすめ