2009-08-20 13 views
17

Bugün biraz kod yazıyordum ve beklediğim gibi bir şey çalışmıyordu.C# Koşullu deyimler sorununu geçersiz kılma

Aşağıdaki kod, koşulun yanlış olarak değerlendirilmiş olmasına rağmen neden yürütülür?

alt text http://img215.imageshack.us/img215/3011/agfewrf.gif

Ben iki koşula etrafında parantez koyarak ve konumlarını değiştirme denedi, ama EndedUsingApplication bile hala yürütür.

DÜZENLEME:

O ile ilgisi yoktur || veya & & operatörleri. işte öyle, ben suçlu kodu göndermeden sürece

alt text http://img20.imageshack.us/img20/6655/aaaaaal.gif

Kimse benim hata öğrenebilirler ... Bu bir bak. Burada

public static bool operator ==(ActiveApplication a, ActiveApplication b) 
    { 
    if ((object)a == null || (object)b == null) 
     return false; 
    return a.process_name == b.process_name && a.window_title == b.window_title; 
    } 

    public static bool operator !=(ActiveApplication a, ActiveApplication b) 
    { 
    return a == b ? false : true; 
    } 

Ve

! = operatörü iki boş değerler alındığında

public static bool operator ==(ActiveApplication a, ActiveApplication b) 
    { 
    // Casting to object class prevents this comparison operator being executed 
    // again and causing an infinite loop (which I think .NET detects and stops 
    // but it would still be a huge hole in the logic. 
    if ((object)a == null && (object)b == null) 
     return true; 
    if ((object)a == null^(object)b == null) 
     return false; 
    return a.process_name == b.process_name && a.window_title == b.window_title; 
    } 

    public static bool operator !=(ActiveApplication a, ActiveApplication b) 
    { 
    return a == b ? false : true; 
    } 

sorun olduğu ortaya çıktı ... çalışma kodudur.

+0

Eğer bu kodu gönderebilir miyim:

danish

+0

@Jay Riggs: Bingo! Evet, sahip olduğum ortaya çıktı. Orada yanlış bir sonuç döndüren bazı kötü mantık var. Uygun bir cevap yazın ve belki cevap olarak işaretleyeceğim;) – Nippysaurus

+0

@Nippy - cevap olarak ekle! Teşekkürler! –

cevap

51

!='a aşırı yüklediniz mi?

public static bool operator ==(ActiveApplication a, ActiveApplication b) 
    { 
    // same reference so equals is true - will be true for null == null 
    if (object.ReferenceEquals(a, b)) 
     return true; 

    // one is null and the other is not 
    if (object.ReferenceEquals(a, null) || object.ReferenceEquals(b, null)) 
     return false; 

    // dealt with all combinations of null - compare fields 
    return a.process_name == b.process_name && a.window_title == b.window_title; 
    } 

    public static bool operator !=(ActiveApplication a, ActiveApplication b) 
    { 
    return !(a == b); 
    } 
+0

Açıklama için orijinal soruya bakınız. – Nippysaurus

+0

Vay, harika bir çağrı. –

+0

Sanırım burada öğrenilecek bir ders var, –

3

Neden olmadığından emin değilsiniz. Ancak, çalışan uygulamanın, adım attığınız kod kullanılarak derlendiğinden emin misiniz? Bu tür bir şeyi, aslında kodun gerçekte yürütüldüğünden farklı olduğunu gördüm.

1

Programınız çok iş parçacıklı mı?

Bir değeri kontrol ettiğim ve daha sonra yalnızca değiştirileni bulmak için kullanmayı denediğim durumları gördüm. Ne oldu, ben kontrol ettikten sonra ama onu kullanmadan önce değeri değiştiren başka bir iş parçacığı olduğunu.

1

Vurguladığınız satırda olduğunuzdan emin misiniz? Çağrı yığını penceresinde tıklayabilir ve arama değişkeninin herhangi bir kısmını "mevcut" satırın içinde değişkenlerin değerini alabilmeniz anlamında yapabilirsiniz. o takdirde değerlendirildiğinde ActiveApplication boş değildi, ama ayıklayıcısında bunu değerlendirirken yaparken şimdi takdirde boş olacak şekilde

Noktası olmak, belki EndedUsingApplication, null ActiveApplication ayarlar.

Bu satırı yürütmeden önce ActiveApplication'ın boş olduğundan emin olmak için EndedUsingApplication (ActiveApplication) satırında bir kesme noktası koydunuz mu?

1

ben daha açık olduğu gibi daha iyi bir yaklaşım Object.ReferenceEquals kullanmak olduğunu düşünüyorum?