2010-04-19 9 views
16

Ich habe über das Überladen von True und False in C# gelesen, und ich denke, ich verstehe den grundlegenden Unterschied zwischen diesem und der Definition eines Bool-Operators. Das Beispiel, das ich um zu sehen ist so etwas wie:Warum überladen wahr und falsch statt Bool Operator zu definieren?

public static bool operator true(Foo foo) { 
    return (foo.PropA > 0); 
} 
public static bool operator false(Foo foo) { 
    return (foo.PropA <= 0); 
} 

Für mich ist dies die gleiche wie zu sagen:

public static implicit operator bool(Foo foo) { 
    return (foo.PropA > 0); 
} 

Der Unterschied, soweit ich das beurteilen kann, ist, dass durch wahr und falsch zu definieren getrennt, können Sie ein Objekt haben, die sowohl wahr und falsch, oder nicht wahr oder falsch ist:

public static bool operator true(Foo foo) { return true; } 
public static bool operator false(Foo foo) { return true; } 
//or 
public static bool operator true(Foo foo) { return false; } 
public static bool operator false(Foo foo) { return false; } 

ich bin sicher, es gibt einen Grund, dies ist erlaubt, aber ich glaube einfach nicht, was es ist. Wenn Sie möchten, dass ein Objekt in "true" oder "false" konvertiert werden kann, ist ein einzelner Bool-Operator für mich am sinnvollsten.

Kann mir jemand ein Szenario geben, wo es Sinn macht, es anders zu machen?

Dank

+0

Ich habe gerade diese Operatoren gefunden und einige Tests durchgeführt. Es scheint, als ob 'if' nur den' true'-Operator verwendet und 'if (! MyObj)' gar nicht möglich ist, so dass es (noch) keinen Sinn macht, einen widersprüchlichen 'false'-Operator zu implementieren. Habe ich etwas vergessen? Wie kann ich den Operator 'false' überhaupt verwenden? – ygoe

Antwort

11

Wie the docs sagen, Überlastung true und false soll unterstützen (nullable) Datenbank-Typen (Ja/Nein, Y/N, 0/1, etc.).

Und natürlich können Sie sie inkonsistent definieren, wie bei jedem Operator. Es liegt in Ihrer Verantwortung, etwas Sinnvolles zurückzugeben. Der Compiler geht nicht weiter, als dass er keine oder beide benötigt.

+0

Vielen Dank - ich bin nicht so weit in MSDN gekommen - ich habe mich nach dem [Operatorüberladen] umgesehen (http://msdn.microsoft.com/en-us/library/aa288467 (VS.71% 29.aspx " "Operator overloading") Seite, das war nicht viel Hilfe.Ich denke ich habe nicht darüber nachgedacht, dass Sie == /! = auf die gleiche Weise überladen können, wo sie miteinander in Konflikt geraten, ich könnte mir einfach nicht vorstellen, es tatsächlich zu tun Danke für den Tipp –

1

auf dem System kann je wahr jeder Wert ungleich Null sein. In anderen kann es ein beliebiger positiver Wert sein.

Andere Systeme sind nicht wirklich boolesch und erlauben einen dritten Zustand null oder null für die booleschen Werte, weshalb Sie möglicherweise true und false überladen, anstatt einen einzelnen bool-Operator zu überlasten.

+0

Dies ist speziell für .NET, also sagst du, dass es für .NET-Anwendungen mit Nicht-.NET-Code sprechen? –

+0

Joe, das ist ein Feature in der Spezifikation für C#, nicht .NET. C# könnte in jedem System verwendet werden, und wahr und falsch müssen möglicherweise ihre Definition geändert haben. –

+0

Benjamin: Danke für die Antwort - ein paar Kommentare: Erstens glaube ich, das ist der Fall für andere .NET-Sprachen, nicht nur C# - VB.NET hat spezielle Operatoren IsTrue und IsFalse, die scheinbar dasselbe sind, es sei denn, ich täusche mich. Sie haben auch erwähnt, dass C# in jedem System verwendet werden kann - ich habe in der Vergangenheit einige Leute solche Dinge sagen hören, aber ich habe nie Erklärungen gehört. Gibt es neben Mono andere Orte außerhalb von .NET, wo C# tatsächlich verwendet wird? Dank –

1

Ich habe gesehen, wie Leute die Überladungen true und false überladen, um clevere Dinge wie das Erstellen von Ausdrücken in .NET 2.0 zu tun, bevor Linq existierte.

Ayende gearbeitet, um eine Syntax wie folgt aus NHibernate Kriterien Abfragen zu erstellen, sein NHQG Projekt mit:

return Repository.FindAll(
    (Where.Publisher.Name == name) && 
    (Where.Publisher.City == city)); 
+5

Ahh, die Tage vor LINQ ... Das waren unschuldige Zeiten, in denen Leute scheußliche Dinge taten, die zu dieser Zeit schlau waren ... –

7

Ich hatte keine Ahnung, diese Betreiber existierten. Das bedeutet, dass Sie die Selbstverneinung Paradox umsetzen können:

public class ThisClassIsFalse 
{ 
    public static bool operator true(ThisClassIsFalse statement) 
    { 
     return statement ? false : true; 
    } 

    public static bool operator false(ThisClassIsFalse statement) 
    { 
     return statement ? true : false; 
    } 
} 

So, jetzt wissen wir, die wahre Lösung für dieses klassische Paradoxon ... Stackoverflow.

+0

public bool ThisMethodReturnsFalse() {return true;} –

Verwandte Themen