Visual Basic'te, ifade IIf
yerine işlevi kullanırken bir performans farkı var If
mı?
Visual Basic'te, ifade IIf
yerine işlevi kullanırken bir performans farkı var If
mı?
Yanıtlar:
VB'nin If
sorunun atıfta bulunduğu şu ifadeye sahip olduğunu düşünüyorum:
' Usage 1
Dim result = If(a > 5, "World", "Hello")
' Usage 2
Dim foo = If(result, "Alternative")
Birincisi temelde C # 'ın üçlü koşullu operatörü ve ikincisi onun birleştirme operatörüdür ( result
olmadığı sürece geri dön Nothing
, bu durumda dönüş "Alternative"
). If
bu nedenle değiştirilmiştir IIf
ve ikincisi artık kullanılmamaktadır.
C #, VB'nin koşullu If
operatör kısa devrelerinde olduğu gibi, artık aşağıdakileri güvenle yazabilirsiniz, bu IIf
işlevi kullanarak mümkün değildir :
Dim len = If(text Is Nothing, 0, text.Length)
If
açık ara daha verimlidir IIf
.
That's all you need to know, really
bilgi paylaşımına adanmış bir web sitesi için elverişli bir tutum gibi gelmiyor;)
IIf()
hem doğru hem de yanlış kodu çalıştırır. Sayısal atama gibi basit şeyler için bu çok önemli değil. Ancak herhangi bir işlem gerektiren kod için, eşleşmeyen koşulu çalıştıran ve muhtemelen yan etkilere neden olan döngüleri boşa harcıyorsunuz.
Kod çizimi:
Module Module1
Sub Main()
Dim test As Boolean = False
Dim result As String = IIf(test, Foo(), Bar())
End Sub
Public Function Foo() As String
Console.WriteLine("Foo!")
Return "Foo"
End Function
Public Function Bar() As String
Console.WriteLine("Bar!")
Return "Bar"
End Function
End Module
Çıktılar:
Foo!
Bar!
Ayrıca, IIf ile ilgili bir başka büyük sorun da, [1] bağımsız değişkenlerinde bulunan herhangi bir işlevi gerçekten çağıracak olmasıdır, bu nedenle aşağıdaki gibi bir durumunuz varsa:
string results = IIf(Not oraData.IsDBNull(ndx), oraData.GetString(ndx), string.Empty)
Aslında bir istisna yaratacaktır, çoğu insan işlevi ilk gördüklerinde böyle çalıştığını düşünmez. Bu aynı zamanda bir uygulamadaki bazı hataları düzeltmek için çok zor olabilir.
[1] IIf İşlevi - http://msdn.microsoft.com/en-us/library/27ydhh0d(VS.71).aspx
Tür çıkarım mekanizmasını doğru kullanmak için IIf yerine If kullan daha iyi (Option Infer On)
Bu örnekte, Anahtar Kelimeler If kullandığımda bir dize olarak tanınır:
Dim Keywords = If(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Aksi takdirde, bir Nesne olarak tanınır:
Dim Keywords = IIf(String.IsNullOrEmpty(SelectedKeywords), "N/A", SelectedKeywords)
Bu adama göre , IIf If / Then kadar 6 kat daha uzun sürebilir. YMMV.
Bunun da ötesinde, bu durumda okunabilirlik muhtemelen performanstan daha çok tercih edilmelidir. IIF daha verimli olsa bile, hedef kitle tarafından daha az okunabilir (Visual Basic'te çalışıyorsanız, diğer programcıların kodunuzu kolayca okuyabilmesini istersiniz ki bu VB'nin en büyük nimetidir ... ve bence IIF gibi kavramlarla kayboldu).
Ayrıca, "IF, dillerin sözdiziminin bir parçası olmasına karşın IIF bir işlevdir" ... ki bu bana şunu ima ediyor: Gerçekten daha hızlı olurdu ... eğer bundan başka bir şey olmasa bile, If ifadesi doğrudan kısaltılabilir. söz konusu işlevde bulunan mantığı gerçekleştirmek için bellekte başka bir alana gitmek zorunda kalmak yerine küçük bir işlem kodu kümesine. Bu basmakalıp bir farklılık olabilir, ama kayda değer.
If ve IIf arasındaki temel farkın şudur:
(Test [boolean], ifade1, ifade2) ise bu, test değerine göre satement1 veya ifade2'nin çalıştırılacağı anlamına gelir (sadece bir ifade yürütülecektir)
Dim obj = IIF (test [boolean], ifade1, ifade2) her iki ifadenin de çalışacağı, ancak test değerine göre bunlardan birinin (obj) değerine döneceği anlamına gelir.
yani ifadelerden biri bir istisna atarsa, yine de onu (IIf) 'ye atar, ancak (If)' de koşulun değerini döndürmesi durumunda onu atar.
... neden 6x kadar uzun sürebileceğine gelince, wiki:
IIf bir kütüphane işlevi olduğundan, her zaman bir işlev çağrısının ek yükünü gerektirecektir, oysa bir koşullu operatör büyük olasılıkla satır içi kod üretecektir.
Esasen IIf, C ++ / C # 'daki üçlü bir operatörün eşdeğeridir, bu nedenle, isterseniz size güzel 1 satır if / else tip ifadeleri verir. İsterseniz değerlendirmek için bir işlev de verebilirsiniz.
Bu işlevler farklı! Belki de sadece IF ifadesini kullanmanız gerekir. IIF her zaman daha yavaş olacaktır, çünkü her iki işlevi de yerine getirecek ve standart IF deyimini gerçekleştirecektir.
Neden IIF işlevi olduğunu merak ediyorsanız, belki bu açıklama olabilir:
Sub main()
counter = 0
bln = True
s = iif(bln, f1, f2)
End Sub
Function f1 As String
counter = counter + 1
Return "YES"
End Function
Function f2 As String
counter = counter + 1
Return "NO"
End Function
Dolayısıyla sayaç bundan sonra 2 olacak, ancak s yalnızca "EVET" olacaktır. Bu sayacın işe yaramaz olduğunu biliyorum, ancak bazen her ikisini de çalıştırmanız gereken işlevler vardır, IF'nin doğru veya yanlış olması fark etmez ve bunlardan birinden değişkeninize değer atayın.
IIf()
Bu şekilde kullanmak , kodunuzu okuyan insanların kafasını karıştıracaktır.
IIf
.