2010-01-08 12 views

cevap

8

Or kullanmak için sadece çözüm istediğinizde olan bit seviyesinde aritmetik, yani, bir dizi bit işlemek istiyorum:

Sub SetBit(value As Integer, Bit As Integer) 
    value = value Or (1 << Bit) 
End Sub 

Bu tür Or için uygun tek durumdur. Diğer tüm durumlarda (yani, Boole mantığı kullanılırken), OrElse kullanın. Benzer adlarına rağmen, Or ve OrElse, birbirleriyle karıştırılmaması gereken semantik olarak oldukça farklı işlemlerdir. Boolean s'nin dahili gösteriminin Or bitinin OrElse'a benzer (ama aynı değil) bir etkiyi elde etmesini mümkün kıldığını görürüz. (. BASIC ve VB eski sürümleri - .NET önce - hayır OrElse bir Or çalışmasını sağlayan sadece tarafından bu ilişkiyi istismar)

+1

Konrad en doğru söylemiş ama VB dilinin önceki sürdürücü dan bu konuda daha fazla okumak istiyorsanız Paul Vick makaleye http://www.panopticoncentral.net/archive/2003/08/18/179 kontrol edebilirsiniz .aspx –

+0

@ChrisHaas Maalesef @PaulV (http://panopticoncentral.net/2011/03/29/external-requests-versus-internal-requirements/) [onun eski blog mesajları damla] karar verdi, bu nedenle bu artık bir olduğunu ölü bağlantı. –

+0

Huh, Microsoft'tan ayrıldığını bile bilmiyordum! –

2

Düzenleme: Bu kod kötü olduğu; Bunun mümkün olduğunu belirtmek için sadece bu cevabı ekledim.

Sub DoSomething() 
    Dim succeeded As Boolean 
    succeeded = FirstThing() Or SecondThing() Or ThirdThing() 
    If succeeded Then 
     ' Do something here 
    End If 
End Sub 

FirstThing, SecondThing ve ThirdThing bir bütün olarak icra edilmesi gereken yöntemlerdir Bu durumda: gerçekleşmelidir yan etki çeşit gerçekleştirmek ifadeleri değerlendirirken

Başka bir durum kullanmaktır Ya olurdu bunlardan herhangi biri başarısız olursa olsun, bir başarı değeri biriktirir. Eğer OrElse kullandıysanız, FirstThing veya SecondThing başarısız olursa, başarısız olan yöntemin arkasındaki işlemler gerçekleşmez.

+2

Umarım bu kodun kötülük olduğunu anlarsınız. Yan etkileri istiyorsanız, karşılaştırmaları sırayla yapın. Yukarıdaki kod oldukça iyi gizlenmiş: Ben biri için hemen bunun bir hata olduğunu ve amaçlanmamış olduğunu düşünürdüm. –

+1

+1 cevabınız doğru olduğundan, ancak Konrad'a katılıyorum, bunu yapmak iyi bir uygulama değil! –

+1

Beni yanlış anlamayın - Bunu en ufak bir şekilde savunmuyorum! –

3

Hep bit temelinde aritmetik yaparken dışında yerine Or OrElse kullanmalıdır.

OrElse ilk gerçek olsaydı ikinci maddesini değerlendirmek olmaz, yani kısa devre karşılaştırmasıdır. Bu son derece kullanışlıdır, çünkü genellikle kısa dolaşım olmadan başarısız olabilecek tümceleri (örneğin x'in hiçbir şey XEasSomeProperty değil OrElse olduğunu) isteyeceksiniz.

otomatik ikinci fıkra değerlendirilmesi önemli olabilir çünkü OrElse en tüm 'Ya da' s' yükseltmek mümkün değildir sebebi. Örneğin, "True Or SomeBooleanMethodWhichMightThrowAnEception()" yazabilirim. Bunu OrElse olarak değiştirmek programın anlamını değiştirir.