문제

VB/VB.net에서 일한 사람들은이 가증과 유사한 코드를 보았습니다.

Dim name As String = IIf(obj Is Nothing, "", obj.Name)

나는 세 가지 간단한 이유로 "혐오"라고 말합니다.

  1. IIf a 기능, 모든 매개 변수가 평가된다; 따라서 if obj 위의 전화에서 아무것도 아닙니다 NullReferenceException 던질 것입니다. 이것은 C#과 같은 언어로 단락 된 3 원 운영자에 익숙한 사람에게는 예상치 못한 행동입니다.
  2. 왜냐하면 IIf 함수이므로 함수 호출의 오버 헤드가 발생합니다. 다시 말하지만, 이것은 큰 문제는 아니지만, 언어에 내재 된 3 가지 작전으로 행동하기를 기대하는 사람에게는 옳지 않다고 느끼지 않습니다.
  3. IIf 비전자이므로 유형의 매개 변수를 수용합니다 Object, 이는 다음 콜 박스 (I Believe)를 의미합니다. 총 3 개의 정수 :

    ' boxes 2nd and 3rd arguments as well as return value '
    Dim value As Integer = IIf(condition, 1, -1)

이제 VB.net의 최근 버전에서 If 운영자가 도입되었으며, 이는 IIf 기능이지만 (내가 이해하는대로) 같은 단점이 없습니다. 즉, 그것은 말입니다 하다 단락 및 IT를 제공하십시오 ~이다 내장 VB 작업. 그러나 나는 마지막 부분에 대해 잘 모르겠습니다. 그만큼 MSDN 문서 여부를 나타내지 않는 것 같습니다 If 박스의 논쟁 여부. 아는 사람 있나요?

도움이 되었습니까?

해결책

가장 중요한 것은 당신이 새로운 것을 올바르게 식별했다는 것입니다. If 로서 운영자 기능보다는. 또한 TypeSafe이므로 권투가 필요하지 않으므로 조건부/3 차/에 대한 직접 매핑입니까? C/C ++/C#/Java 등의 연산자

새 연산자가 없어도이 코드를 통해 VB.NET을 약간 개선 할 수 있습니다.

Public Shared Function IIf(Of T)(ByVal Expression As Boolean, ByVal TruePart As T, ByVal FalsePart As T) As T
    If Expression Then Return TruePart Else Return FalsePart
End Function

다른 팁

Joel은 저를 대답하기 위해 저를 이겼습니다. 그러나 여기에는 샘플 프로그램과 생성 된 IL이 if ()가 권투없이 IL의 기본 원 3 운영자에게 전달된다는 것을 보여줍니다.

Public Class Test
    Public Sub New()
        Dim rnd = New Random()
        Dim result As Integer = If(rnd.Next(1000) < 500, 1, -1)
        Console.WriteLine(result)
    End Sub
End Class

보시다시피 IL에는 '상자'진술이 없습니다.

.method public specialname rtspecialname instance void .ctor() cil managed
{
    .maxstack 2
    .locals init (
        [0] int32 result,
        [1] class [mscorlib]System.Random rnd)
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: call instance void [mscorlib]System.Object::.ctor()
    L_0007: nop 
    L_0008: newobj instance void [mscorlib]System.Random::.ctor()
    L_000d: stloc.1 
    L_000e: ldloc.1 
    L_000f: ldc.i4 0x3e8
    L_0014: callvirt instance int32 [mscorlib]System.Random::Next(int32)
    L_0019: ldc.i4 500
    L_001e: blt.s L_0023
    L_0020: ldc.i4.m1 
    L_0021: br.s L_0024
    L_0023: ldc.i4.1 
    L_0024: stloc.0 
    L_0025: ldloc.0 
    L_0026: call void [mscorlib]System.Console::WriteLine(int32)
    L_002b: nop 
    L_002c: nop 
    L_002d: ret 
}

동일한 프로그램이 있지만 이전 iif () 함수를 사용하면 다음 IL이 생성됩니다. 권투와 기능이 오버 헤드를 모두 볼 수 있습니다.

.method public specialname rtspecialname instance void .ctor() cil managed
{
    .maxstack 3
    .locals init (
        [0] int32 result,
        [1] class [mscorlib]System.Random rnd)
    L_0000: nop 
    L_0001: ldarg.0 
    L_0002: call instance void [mscorlib]System.Object::.ctor()
    L_0007: nop 
    L_0008: newobj instance void [mscorlib]System.Random::.ctor()
    L_000d: stloc.1 
    L_000e: ldloc.1 
    L_000f: ldc.i4 0x3e8
    L_0014: callvirt instance int32 [mscorlib]System.Random::Next(int32)
    L_0019: ldc.i4 500
    L_001e: clt 
    L_0020: ldc.i4.1 
    L_0021: box int32
    L_0026: ldc.i4.m1 
    L_0027: box int32
    L_002c: call object [Microsoft.VisualBasic]Microsoft.VisualBasic.Interaction::IIf(bool, object, object)
    L_0031: call int32 [Microsoft.VisualBasic]Microsoft.VisualBasic.CompilerServices.Conversions::ToInteger(object)
    L_0036: stloc.0 
    L_0037: ldloc.0 
    L_0038: call void [mscorlib]System.Console::WriteLine(int32)
    L_003d: nop 
    L_003e: nop 
    L_003f: ret 
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top