C\#에서 explicit 와 implicit 의 깊 은 이해
오늘 회사 프로젝트 의 틀 을 연구 할 때 아래 의 용법 을 보 았 다.
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);
}
}
}
/*
:
*/
참고 자료이상 은 이 글 의 모든 내용 입 니 다.본 고의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 참고 학습 가 치 를 가지 기 를 바 랍 니 다.여러분 의 저희 에 대한 지지 에 감 사 드 립 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
C#Task를 사용하여 비동기식 작업을 수행하는 방법라인이 완성된 후에 이 라인을 다시 시작할 수 없습니다.반대로 조인(Join)만 결합할 수 있습니다 (프로세스가 현재 라인을 막습니다). 임무는 조합할 수 있는 것이다. 연장을 사용하여 그것들을 한데 연결시키는 것이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.