2009-02-27 3 views
2

HINTERGRUND zu testen geschrieben werden: Ich habe eine benutzerdefinierte Klasse in C# geschrieben (2005), mit Code ähnlich den folgenden:Wie kann eine C# Klasse gegen 0 sowie null

public class Savepoint 
{ 
    public int iOffset;     /* Starting offset in main journal */ 
    public u32 nOrig;     /* Original number of pages in file */ 
    public u32 iSubRec;     /* Index of first record in sub-journal */ 
}; 

Nach Variable wurde mit Savepoint sp deklariert; Ich kann testen, ob hat mit Code ähnlich instanziiert worden:

if (sp != null) {...} 

FRAGE: Ist es möglich, die Klasse Bediener irgendwie zu überlasten, so dass ich auch als auch die folgende Syntax verwenden: if (! sp) {...} oder if (sp = 0) {...}

PS: ich habe keinen wirklich guten Grund für den Wunsch, wenn (sp) außer der Gewohnheit Kraft zu schreiben.

+0

Vielleicht den Grund zu erklären helfen, eine schmackhafte Antwort. –

+0

Deshalb habe ich die PS hinzugefügt, es gibt keinen "guten Grund", nur meine tief verwurzelten Programmiergewohnheiten und Neugier – Noah

Antwort

4

Ich denke, Sie können eine implizite Besetzung zu Bool hinzufügen ... so etwas sollte funktionieren.

public static implicit operator bool(Savepoint sp) 
{ 
    return sp != null; 
} 

Beispiel:

Savepoint sp1 = new Savepoint(); 
sp1.iOffset = 4; 
Savepoint sp2 = new Savepoint(); 
Savepoint sp3 = null; 

Console.WriteLine("sp1: " + (sp1 ? "true" : "false")); // prints true 
Console.WriteLine("sp2: " + (sp2 ? "true" : "false")); // prints true 
Console.WriteLine("sp3: " + (sp3 ? "true" : "false")); // prints false 
+0

Schöne Lösung. Ich werde Ihre Antwort akzeptieren, wenn Sie Ihren Code ändern, um den iOffset-Test im Operator bool, etwa zurück (sp! = Null) – Noah

+0

Ehm sicher, behoben :-) – Aistina

+0

Was ist der implizite Punkt? –

17

Sie können dies möglicherweise in C# mit dem Standard-Property-Decorator tun, aber Sie sollten nicht. Der Versuch, C# zu schreiben, als ob es sich um eine Ente-typisierte Sprache handeln würde, wird zu allerlei kognitiver Dissonanz auf der ganzen Linie führen.

Als Faustregel gilt, dass es eine gute Idee ist, die Sprache der Sprache, in der Sie arbeiten, zu umarmen, anstatt sie in eine vertrautere Form zu stopfen, in der sie nie enthalten war.

3

Die if-Anweisung in C# benötigt einen booleschen Ausdruck und führt keine Konvertierung in Boolean durch, wenn der Ausdruck nicht boolesch ist, anders als in C (oder Javascript). Mein Rat ist, sich nur mit dem kleinen Ärger zu beschäftigen und das Standard-C# -Idiom zu verwenden.

Verwandte Themen