C\#if 문장의 병렬 조건 에 대한 실행

3985 단어 병렬 조건
C\#언어 에서 도 마찬가지다.여러 조건 이 논리 와 조작 을 할 때 판정 은 표현 식 왼쪽 에서 오른쪽으로 실 행 됩 니 다.어떤 것 이 가짜 인지 만 나 면 그 다음 에는 하지 않 습 니 다.똑똑 하지만 뒤의 조건 에 이상 이 생기 면 잠재 적 인 문제 다.이전의 조건 이 사실 이 라면 계속 집행 하고 이상 한 조건 을 던 질 때 까지 실행 하면 프로그램 이 터 집 니 다.하하.우 리 는 간단 한 데 모 를 써 볼 수 있다.아래 의 이 코드 는 아버 지 를 속 이 는 것 입 니 다.그 후에 제 가 원인 을 설명 하 겠 습 니 다.하지만 여러분 은 먼저 직관 적 인 측면 에서 이해 하 셔 도 됩 니 다.마지막 으로 저 는 정확 한 테스트 방법 을 제시 하 겠 습 니 다.
 
static void Main(string[] args)
{
DataSet ds = null;
if (false && ds.Tables[0].Rows.Count > 0)
{
Console.WriteLine("Fuck");
}
else
{
Console.WriteLine("Shit");
}
if (true && ds.Tables[0].Rows.Count > 0)
{
Console.WriteLine("WOW");
}
else
{
Console.WriteLine("KAO");
}
Console.ReadKey();
}
이 코드 는 언뜻 보기 에는 문제 가 없 으 며,실행 할 때 도 우리 가 기대 하 는 결 과 를 내 놓 았 다.즉,첫 번 째 문 구 는 Shit 를 출력 하고 이상 을 던 지지 않 는 다(앞 이 false 이 고,뒤 에는 이상 한 ds.Tables[0].Rows.count>0 은 하지 않 는 다).두 번 째 문 구 는 앞 이 true 이기 때문에 dataset 에 대한 판단 을 실행 해 야 하기 때문에 이상 을 던 졌 다.그러나 reflector 반 컴 파일 러 집합 을 사용 하면 컴 파일 러 가 위의 코드 를 아래 와 같은 형식 으로 최적화 시 켰 다 는 것 을 알 수 있 습 니 다.우리 의 if 구문 에 죽은 true 와 false 는 이미 제거 되 었 기 때문에 if 문 구 를 실행 하 는 문 제 를 설명 할 수 없습니다.
 
private static void Main(string[] args)
{
DataSet ds = null;
Console.WriteLine("Shit");
if (ds.Tables[0].Rows.Count > 0)
{
Console.WriteLine("WOW");
}
else
{
Console.WriteLine("KAO");
}
Console.ReadKey();
}
사실 자세히 살 펴 보면 이 코드 를 입력 하 는 과정 에서 VS 는 if(false&ds.Tables[0].Rows.count>0)에서 후 자 는 도달 할 수 없다 는 것 을 알 렸 다.이것 은 즉시 컴 파일 한 효과 다.즉시 컴 파일 하여 뒤의 코드 가 도달 할 수 없다 고 말 한 이상 도달 할 수 없 는 코드 가 컴 파일 기간 에 잘 린 다 는 것 을 의미한다.그래서 방금 우리 가 위 에서 본 번역 결 과 는 자 연 스 러 운 일이 다.마찬가지 로 1==0,1==1 이라는 조건 을 직접 맞 추 면 컴 파일 러 도 발견 할 수 있다.그래서 우 리 는 컴 파일 러 에 의 해 발견 되 지 않 는 쓰기 방법 을 찾 아야 한다.우리 의 조건 은 코드 가 컴 파일 할 때 만 실행 되 고 컴 파일 할 때 조정 되 는 것 이 아니 라 실행 할 수 있 도록 해 야 한다.예 를 들 어 다음 과 같은 것 이다.
 
static void Main(string[] args)
{
DataSet ds = null;
int i = 0;
int j = 1;
if (i + j == 0 && ds.Tables[0].Rows.Count > 0)
{
Console.WriteLine("Fuck");
}
else
{
Console.WriteLine("Shit");
}
if (i + j == 1 && ds.Tables[0].Rows.Count > 0)
{
Console.WriteLine("WOW");
}
else
{
Console.WriteLine("KAO");
}
Console.ReadKey();
}
우 리 는 다시 집행 하고 이번 결 과 는 진정한 의미 로 우리 의 목적 을 만족 시 켰 다 는 것 을 발견 했다.이 는 여러 조건 이 논리 적 으로 진행 할 때 C\#의 집행 체 제 를 설명 했다.
이 글 을 쓰 는 의 미 는 프로그램 을 쓸 때 주의 조건 에서 이상 이 발생 할 수 있 는 곳 을 만 들 기 위 한 것 이다.예 를 들 어 우 리 는 String.IsNullOrEmpty()를 모 의 한다.or 관계 에서 하나의 true 만 있 으 면 전체 표현 식 은 true 입 니 다.그러나 이상 을 일 으 킬 수 있 는 문 구 를 먼저 놓 으 면 트 루 의 문 구 를 실행 하고 폭발 할 것 이다.예 를 들 어 이렇게 쓰 면 터 집 니 다.Length 를 판단 하 는 전 제 는 string 이 있어 야 하기 때 문 입 니 다.
 
public static bool IsNullOrEmpty(string str)
{
if (str.Length == 0 || str == null)
{
return true;
}
return false;
}
 이렇게 쓰 면 정상 입 니 다.
 
public static bool IsNullOrEmpty(string str)
{
if (str == null || str.Length == 0)
{
return true;
}
return false;
}
마이크로소프트 는 이렇게 썼 다.토치카!
 
public static bool IsNullOrEmpty(string value)
{
if (value != null)
{
return (value.Length == 0);
}
return true;
}
위의 이 코드 는 reflector 로 mscorlib 의 System.String 을 열 어 찾 을 수 있 습 니 다~

좋은 웹페이지 즐겨찾기