C\#에서 explicit 와 implicit 의 깊 은 이해

6261 단어 c#explicitimplicit
머리말
오늘 회사 프로젝트 의 틀 을 연구 할 때 아래 의 용법 을 보 았 다.public static implicit operator JsonData(int data);오랫동안 이런 암시 적 전환 기법 을 사용 해 본 적 이 없 는 것 같 으 니 C\#에서 전환 에 관 한 지식 을 다시 복습 해 보 자.
explicit 와 implicit 는 연산 자 를 바 꾸 는 것 입 니 다.이 두 가지 로 사용자 정의 형식 지원 을 서로 교환 할 수 있 습 니 다.
explicti 는 명시 적 변환 을 표시 합 니 다.예 를 들 어 A->B 에서 강제 형식 변환 을 해 야 합 니 다(B=(B)A)
implicit 는 암시 적 전환 을 표시 합 니 다.예 를 들 어 B->A 에서 직접 값 을 부여 하기 만 하면 됩 니 다(A=B)
implicit
implicit 키 워드 는 암시 적 사용자 정의 형식 변환 연산 자 를 설명 하 는 데 사 용 됩 니 다.변환 과정 에서 데 이 터 를 잃 어 버 리 지 않도록 확보 할 수 있다 면 이 키 워드 를 사용 하여 사용자 정의 형식 과 다른 유형 사이 에서 암시 적 으로 변환 할 수 있 습 니 다.
암시 적 변환 연산 자 를 사용 한 후 컴 파일 할 때 이상 검 사 를 건 너 뛰 기 때문에 암시 적 변환 연산 자 는 이상 을 일 으 키 지 않 고 정 보 를 잃 지 않 아야 합 니 다.그렇지 않 으 면 실행 할 때 예상 치 못 한 문제 가 발생 할 수 있 습 니 다.
예시

class Digit
{
 public Digit(double d) { val = d; }
 public double val;
 // ...other members

 // User-defined conversion from Digit to double
 public static implicit operator double(Digit d)
 {
  return d.val;
 }
 // User-defined conversion from double to Digit
 public static implicit operator Digit(double d)
 {
  return new Digit(d);
 }
}

class Program
{
 static void Main(string[] args)
 {
  Digit dig = new Digit(7);
  //This call invokes the implicit "double" operator
  double num = dig;
  //This call invokes the implicit "Digit" operator
  Digit dig2 = 12;
  Console.WriteLine("num = {0} dig2 = {1}", num, dig2.val);
  Console.ReadLine();
 }
}
암시 적 변환 은 불필요 한 강제 변환 을 없 애 는 것 을 통 해 소스 코드 의 가 독성 을 높 일 수 있다.그러나 암시 적 전환 은 프로그래머 가 하나의 유형 을 다른 유형 으로 강제 전환 할 필요 가 없 기 때문에 암시 적 전환 을 사용 할 때 의외 의 결과 가 발생 하지 않도록 각별히 조심해 야 한다.일반적으로 암시 적 변환 연산 자 는 프로그래머 가 모 르 는 상태 에서 안전하게 사용 할 수 있 도록 이상 을 일 으 키 지 않 고 정 보 를 잃 어 버 리 지 않 아야 한다.연산 자 를 바 꾸 는 것 이 그 조건 을 만족 시 키 지 못 한다 면 explicit 로 표시 해 야 합 니 다.자세 한 정 보 는 참고 하 시기 바 랍 니 다변환 연산 자 사용.
명시 적 디 스 플레이 변환
explicit 키워드 성명 은 사용자 가 정의 하 는 형식 변환 연산 자 를 표시 하여 변환 해 야 합 니 다.
다음 예제 에 서 는 Fahrenheit 류 에서 Celsius 류 로 전환 하 는 연산 자 를 정의 합 니 다.Fahrenheit 클래스 나 Celsius 클래스 에서 연산 자 를 정의 해 야 합 니 다:

public static explicit operator Celsius(Fahrenheit fahr)
{
 return new Celsius((5.0f / 9.0f) * (fahr.Degrees - 32));
}
다음 과 같이 사용자 가 정의 한 변환 연산 자 를 호출 하여 강제로 변환 합 니 다.

Fahrenheit fahr = new Fahrenheit(100.0f);
Console.Write($"{fahr.Degrees} Fahrenheit");
Celsius c = (Celsius)fahr;
이 변환 연산 자 는 원본 형식 에서 대상 형식 으로 변 환 됩 니 다.원본 형식 은 변환 연산 자 를 제공 합 니 다.암시 적 변환 과 달리 명시 적 변환 연산 자 는 반드시 전환 방식 으로 호출 해 야 한다.변환 작업 이 이상 하거나 정 보 를 잃 어 버 릴 경우 explicit 로 표시 해 야 합 니 다.이것 은 컴 파일 러 의 침묵 호출 이 의외 의 결 과 를 가 져 올 수 있 는 전환 작업 을 막 을 수 있다.
변환 을 생략 하면 컴 파일 시 오류 가 발생 합 니 다 CS 0266.
자세 한 정 보 는 참고 하 시기 바 랍 니 다변환 연산 자 사용.
예시
아래 의 예 는 Fahrenheit 와 Celsius 류 를 제공 하 는데 그 중에서 각 종 류 는 다른 종류의 명시 적 변환 연산 자 를 제공 합 니 다.

class Celsius
{
 public Celsius(float temp)
 {
  Degrees = temp;
 }
 
 public float Degrees { get; }
 
 public static explicit operator Fahrenheit(Celsius c)
 {
  return new Fahrenheit((9.0f / 5.0f) * c.Degrees + 32);
 }
}

class Fahrenheit
{
 public Fahrenheit(float temp)
 {
  Degrees = temp;
 }
 
 public float Degrees { get; }
 
 public static explicit operator Celsius(Fahrenheit fahr)
 {
  return new Celsius((5.0f / 9.0f) * (fahr.Degrees - 32));
 }
}

class MainClass
{
 static void Main()
 {
  Fahrenheit fahr = new Fahrenheit(100.0f);
  Console.Write($"{fahr.Degrees} Fahrenheit");
  Celsius c = (Celsius)fahr;

  Console.Write($" = {c.Degrees} Celsius");
  Fahrenheit fahr2 = (Fahrenheit)c;
  Console.WriteLine($" = {fahr2.Degrees} Fahrenheit");
 }
}
//   :
// 100 Fahrenheit = 37.77778 Celsius = 100 Fahrenheit
예시
다음 예제 에 서 는 하나의 10 진수 숫자 를 나타 내 는 구조 Digit 를 정의 합 니 다.연산 자 를 byte 에서 Digit 로 변환 하 는 것 으로 정의 하지만 모든 바이트 가 Digit 로 변환 되 는 것 은 아니 기 때문에 이 변환 은 명시 적 변환 을 적용 해 야 합 니 다.

struct Digit
{
 byte value;
 public Digit(byte value)
 {
  if (value > 9)
  {
   throw new ArgumentException();
  }
  this.value = value;
 }

 //    byte Digit      explicit operator:
 public static explicit operator Digit(byte b)
 {
  Digit d = new Digit(b);
  Console.WriteLine("     ");
  return d;
 }
}

class ExplicitTest
{
 static void Main()
 {
  try
  {
   byte b = 3;
   Digit d = (Digit)b; //     
  }
  catch (Exception e)
  {
   Console.WriteLine("{0}      .", e);
  }
 }
}
/*
  :
     
*/
참고 자료
  • explicit
  • operator (C# Reference)
  • How to: Implement User-Defined Conversions Between Structs
  • implicit
  • 총결산
    이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기