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

C#에서 명시적(Explicit)과 은닉적(Implicit) 사용 예제 공유

오늘 Review를 진행하면서 오랜 프로젝트에서 이상한 코드를 발견했습니다.

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

중국어 단어 dto.Payment은 PaymentDTO 클래스의 인스턴스입니다.63;.Payment은 Payment 클래스의 인스턴스입니다. PaymentDTO 클래스와 Payment 클래스는 상속 관계가 없기 때문에, 서브 클래스와 부모 클래스 간의 암시적 변환은 존재하지 않습니다.

이상하게도 Visual Studio의 컴파일러는 어떤 컴파일 오류도 경고하지 않았습니다.

PaymentDTO 클래스의 정의를 열어보면 다음과 같은 메서드 서명을 발견했습니다.

public static implicit operator PaymentDTO(Payment payment)

메서드 서명에서 보면 이것은 PaymentDTO 타입의 오버라이드 연산자입니다. 하지만 이전에 자주 사용했던 것과는 다릅니다+,-,*,/, == 등.

MSDN을 검색한 후에야 implicit과 explicit이 변환 연산자 쌍임을 알게 되었습니다.

Implicit과 Explicit

Implicit

Implicit 키워드는 사용자 정의된 암시적 타입 변환 연산자를宣言합니다. 그것은 다음과 같은 기능을 수행할 수 있습니다2다른 클래스 간의 암시적 변환을 사용하여 코드의 가독성을 높일 수 있습니다. 하지만 사용자 정의된 암시적 변환 연산자를 사용한 후, 컴파일 시 예외 검사를 건너뛰기 때문에, 예외를 일으키지 않고 정보를 잃지 않도록 해야 합니다. 그렇지 않으면 실행 시 예상치 못한 문제가 발생할 수 있습니다.

예를 들어 현재 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("C",2"
        };
      }
    }

호출할 때는 단순히 할당만으로도 됩니다

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

Explicit

Explicit 키워드는 사용자 정의된 타입 변환 연산자를 호출하는 데 사용되어야 합니다. Implicit 변환과는 달리, Explicit 변환 연산자는 변환을 통해 호출되어야 하며, Explicit 변환을 누락하면 컴파일 시 오류가 발생합니다.

예를 들어 지금 우리는 이전 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#w로 이메일을 보내 주시기 바랍니다.3codebox.com에 (보내는 이메일에서 #을 @으로 변경하십시오) 신고를 하시고 관련 증거를 제공하시면, 해당 내용이 확인되면 즉시 해당 내용을 삭제하겠습니다.

추천 항목