문제

본 다음과 같이 몇 번을...나는 그것을 싫어합니다.이것이 기본적으로'부정 행위를'언어?니다.고려할 것이야'확인'기 때문에 IsNullOrEmpty 평가 첫째,모든 시간은?

(우리는 주장할 수 있는지 여부 문자열이 NULL 이어야 합니다면 그것의 기능,그러나 정말 되지 않습니다 질문입니다.)

string someString;
someString = MagicFunction();

if (!string.IsNullOrEmpty(someString) && someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // On a NULL string, it drops to here, because first evaluation of IsNullOrEmpty fails
   // However, the Length function, if used by itself, would throw an exception.
}

편집: 덕분에 다시 모든 사람에게 상기시켜 나이 언어의 기본이다.는 동안 나는"왜"그것은 일을 믿을 수 없어,내가 알았/의 이름을 기억하는 개념입니다.

(경우에는 누구든지 원하는 모든이다.이면서 문제 해결을 생성한 예외 NULL 문자열.길이>x 예외...다른 장소에서의 코드입니다.그래서 봤을 때 위의 코드,이외에 다른 모든 것,내 좌절했습니다.)

도움이 되었습니까?

해결책

단락으로 알려진 언어 기능을 활용하고 있습니다. 이것은 언어를 속이는 것이 아니라 실제로 사용되는 방식을 정확히 사용하는 기능을 사용합니다.

다른 팁

"단락"관계자에 의존해도 괜찮은지 묻는 경우 && 그리고 ||, 그렇습니다. 완전히 괜찮습니다.

아무 잘못이 없이,당신이 그냥을 확실히 얻을 수 없습 nullpointer 예외는 아니다.

내가 생각하는 것이 합리적이다.

으로 확장할 수 있게 세탁기술자,그러나 기본적인 개념은 여전히 유효합니다.

이 코드는 완전히 유효하지만 Null 유형 검사를 피하기 위해 Null Coalesce 연산자를 사용하고 싶습니다.

string someString = MagicFunction() ?? string.Empty;
if (someString.Length > 3)
{
    // normal string, do whatever
}
else
{
   // NULL strings will be converted to Length = 0 and will end up here.
}

이것에 아무런 문제가 없습니다.

if (조건이 왼쪽에서 오른쪽으로 평가되므로 이와 같이 쌓는 것이 완벽합니다.

이것은 내 의견으로는 유효한 코드입니다 (변수를 선언하고 다음 줄에 할당하는 것은 꽤 성가 시지만) 그러나 문자열의 길이가 <인 조건에서 다른 블록을 입력 할 수 있다는 것을 알아야합니다. 삼.

논리적으로 단락을 완벽하게 합리적으로 사용하는 것처럼 보입니다. ~와 함께 언어. 나는 최근에 VB6에서 나왔습니다 항상 짧은 회로, 그리고 그것은 정말로 성가신 것입니다 .

조심해야 할 한 가지 문제는 다른 조항에서 Null을 다시 테스트해야 할 수도 있다는 것입니다. 왜냐하면, 당신은 널 끈과 길이가없는 줄로 길이가없는 끈으로 감을 것입니다.

이것은 완벽하게 유효하며 그런 식으로 사용하는 데 아무런 문제가 없습니다. 당신이 언어에 대한 문서화 된 행동을 따르고 있다면 모든 것보다 좋습니다. C#에서 사용중인 구문은 조건부 로직 연산자이며 Thier Docemented Bahviour는 찾을 수 있습니다. MSDN

저에게는 곱셈 연산이 먼저 수행되기 때문에 언어 문서에서 곱하기 및 추가 문서에서 획기화를 수행 할 때 괄호를 사용할 때와 동일합니다.

단락에 의존하는 것은 대부분의 경우해야 할 "올바른 일"입니다. 이동 부품이 적은 Terser 코드로 이어집니다. 일반적으로 유지하기가 더 쉽습니다. 이것은 C 및 C ++에서 특히 그렇습니다.

나는 단락 작업에 익숙하지 않은 사람을 고용하는 사람을 진지하게 재고 할 것입니다.

나는 괜찮습니다. :) 당신은 단지 당신이 널 변수에 액세스하지 않도록하고 있습니다. 실제로, 나는 항상 내 변수에 대한 작업을 수행하기 전에 (또한 컬렉션을 인덱싱 할 때) - 더 안전하고 모범 사례입니다. 그게 전부입니다.

기본적으로 단락 조건을 기본적으로 C#이므로 이루어 지므로이를 유리하게 사용하는 것이 좋다고 생각합니다. VB에서는 개발자가 사용하는 경우 몇 가지 문제가있을 수 있으며 안달 소 대신에 문제가있을 수 있습니다.

나는 그것이 다음과 같은 것과 다르다고 생각합니다.

INT* pNumber = GetAddressOfNumber();

if ((pNUmber != NULL) && (*pNumber > 0))
{
  // valid number, do whatever
}
else
{
  // On a null pointer, it drops to here, because (pNumber != NULL) fails
  // However, (*pNumber > 0), if used by itself, would throw and exception when dereferencing NULL
}

언어의 기능을 활용하고 있습니다. 이런 종류의 관용구는 공통적으로 사용되어 왔습니다. C는 이러한 방식으로 부울 표현을 실행하기 시작했기 때문에 (또는 언어가 먼저 한 언어).)

C의 코드 인 경우 어셈블리로 편집 한 코드 인 경우 올바른 동작을 단락시킬뿐만 아니라 더 빠르게. 머신 langauge에서 IF 문의 부분은 차례로 평가됩니다. 단락이 느려지지 않습니다.

쓰기 코드 비용이 많이$하는 회사입니다.하지만 그것을 유지하에 더 많은 비용!

그래서 나는 당신과 확인을점:기회는이 라인의 코드가 이해되지 않을 즉각하여 사람은 그것을 읽어야 할 것이고 올바른에서 2 년이다.

의 과정,그가야 하는 중요한 생산 버그입니다.그는 여기에서 검색하고 있고 이를 인식하지 못하게 됩니다.

우리는 항상 코드를 위해 다음 남자 그는 적을 수 있습니다 똑똑한가 있습니다.저 이만 기억할 것이 있습니다.

고 이 의미는 우리가 사용하는 분명한 언어 및 다른 사람입니다.

모든 최,Sylvain.

약간의 주제를 벗어나지 만 이와 같이 vb.net에서 같은 예를 들고 있다면

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) and someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

이것은 null (아무것도) 문자열로 가면 vb.net에서 c#에서 동일하게 코딩합니다.

dim someString as string
someString = MagicFunction()
if not string.IsNullOrEmpty(someString) andalso someString.Length > 3 then
    ' normal string, do whatever
else
    ' do someting else
end if

안탈로를 추가하면 같은 방식으로 행동하게 만들고 더 잘 읽습니다. VB와 C 'Development를 모두 수행하는 사람으로서 두 번째 VB One은 로그인이 약간 다르기 때문에 다른 사람에게 다른 사람이 다른 사람에게 설명하기가 쉽다는 것을 보여줍니다.

드럭

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top