VB.NET - IIF(, , ) - "측면"이 모두 평가됩니다.어떤 상황을 주의해야 합니까?
저는 최근에 IIF(A,B,C) 기능에 대해 배웠습니다.저는 최근 SQL 코딩에 많은 시간을 할애한 VB/VB.NET Coder입니다.
SQL에서 수행해야 하는 일반적인 작업 중 하나는 다음과 같습니다.
select (case where @var = 0 then MyTable.Val1 else MyTable.Val2 end) from MyTable
IIF(A,B,C)에서 VB.NET에서 이 작업을 수행할 수 있습니다.한 줄로
하지만 A가 어떤 평가를 받든 B와 C는 모두 평가를 받는다고 읽었습니다.
다음과 같은 몇 가지 분명한 상황을 생각해 볼 수 있습니다.
Dim X as integer = IIF(SomeBoolean = true, ExpensiveFunction1(), ExpensiveFunction2())
이것을 레퍼토리에 포함시킬 것이기 때문에 IIF를 사용하여 문제가 발생할 수 있는 미묘한 상황이 더 있습니까?
일부 상황에서는 구식을 사용하는 것에서 상당히 큰 차이가 납니다.
Dim X as integer
if SomeBoolean = true then
X = ExpensiveFunction1()
else
X = ExpensiveFunction2()
end if
향후 성가신 성능 문제 및/또는 버그를 방지할 수 있기를 바랍니다.
2016년 업데이트
지난 몇 년 동안 IIF() 기능을 사용할 필요가 없는 새로운 VB.NET 기능이 존재했습니다.
if(Something = true, ExecuteA(), ExecuteB())
Execute A() 또는 Execute B()만 실행됩니다.마지막으로 단락이 있는 인라인 IF.
따라서 VB.NET의 최신 버전(2016년 기준)을 사용하는 경우 가능하면 이 버전을 대신 사용하십시오.
여기 가장 흔한 갓챠가 있습니다.
Z = iif(y=0, 0, x/y) 'Throws a divide by zero exception when y is 0
오류 0으로 나눗셈을 피하기 위해 사용하지 마십시오.
또 다른 가능한 로직 버그는 iif 또는 다른 쪽에서 시스템 상태를 수정하거나 출력 매개 변수를 갖는 메서드를 호출하는 경우입니다.
Z = iif(FunctionA(InputOutputParam), FunctionB(InputOutputParam))
'InputOutputParam is indeterminate or at least ambiguous here.
제 경험에 IIF를 사용할 좋은 이유가 없습니다.대부분 코드를 축약하는 데 사용되며 발생할 수 있는 문제를 고려할 때 그럴 가치가 없습니다.게다가, 저는 그것이 코드를 읽기 어렵게 만든다고 생각합니다.
또한 원하는 유형으로 다시 캐스트해야 하는 상자형 값(즉, 개체 데이터 유형)을 반환합니다.
[IIF
,것은 아니다.IFF
]
우리가 본 가장 일반적인 경우는 한쪽 또는 다른 쪽이 평가하는 것입니다.Nothing
.
가 코가다사것예상됩다니으로용을 사용할 것으로 할 수 .IIF
에 걸리지 않기 위한 경비로서.NullReferenceException
다음과 같이:
IIF(something Is Nothing, "nothing", something.Value)
하지만 그것은 효과가 없을 것입니다. 왜냐하면 양쪽 모두 항상 평가되기 때문입니다.이는 C/C++/C#/Java 배경에서 온 사람들이 작성한 코드에서 많이 발생합니다. 그 언어들에서는 3진 연산자가 사용되기 때문입니다.?:
단락 평가를 수행합니다.
그리고 VS 2005 IIF() 문서에는 다음과 같이 명시되어 있습니다.IIF
와 꼭?:
도움이 안 됩니다.
IIf 기능은 Visual C++에서 3차 조건 연산자: ? :에 대응하는 기능을 제공합니다.
그 참조 페이지 어디에도 양측이 모두 평가된다고 명시되어 있지 않습니다.
MSDN에 따르면 VB2008에 도입된 "If" 연산자가 대신 단락될 것이며, 이는 값비싼 계산 사례에 이상적입니다.
http://msdn.microsoft.com/en-us/library/bb513985.aspx
또한 조건에 따라 데이터를 수정하는 ini 기능이 없는지 확인해야 합니다.우리는 그것을 꽤 많이 위해 If를 사용합니다.그것을 기억하는 것은 가치가 있습니다.
저는 (코드의 압축성을 위해) iif를 사용하도록 강요받았는데, 많은 배열에서 값을 스프레드시트로 복사하는 코드 덩어리가 있었지만, 배열의 "아무것도" 항목으로 인해 코드가 서브루틴(크래시가 아님) 나가는 원인이 되기 때문에 배열 셀에 아무것도 포함되어 있지 않은지 확인하기 위해 iif로 줄을 감았습니다.그런 다음 pass back "을(를) 반환합니다. 그렇지 않으면 배열 셀을 다시 반환합니다(1번째 문자열로 변환).위에서 말한 것처럼 iif를 사용하지 않는 또 다른 이유.
MS Access에서 항상 사용하던 NZ 기능이 부족하여 아직도 상중입니다.
언급URL : https://stackoverflow.com/questions/1220411/vb-net-iif-both-sides-are-evaluated-what-situations-should-i-watch-ou
'source' 카테고리의 다른 글
Angular 2: 'input'의 알려진 속성이 아니므로 'ngModel'에 바인딩할 수 없습니다. (0) | 2023.05.17 |
---|---|
자바스크립트와 CSS를 사용하여 스크롤할 때 테이블의 첫 번째 행과 첫 번째 열을 잠그려면 어떻게 해야 합니까? (0) | 2023.05.17 |
리누스 토르발스가 Git이 "절대로" 파일을 추적하지 않는다고 말하는 것은 무엇을 의미합니까? (0) | 2023.05.17 |
셸 스크립트가 호출 셸의 환경 변수를 설정할 수 있습니까? (0) | 2023.05.17 |
다른 열의 셀과 일치하지 않을 때 한 열의 셀 색상 변경 (0) | 2023.05.17 |