2016-08-03 7 views
1

Betrachten Sie dieses kleine Beispiel:Kürzere Version durch eine Instanz einer Basisklasse zu einem Mitglied einer abgeleiteten Klasse zuweisen

public class BaseClass { } 
public class DerivedClass : BaseClass { public int Field; } 

public static class Program 
{ 
    public static void Main(string[] args) 
    { 
     BaseClass baseVar = new DerivedClass(); 

     if(baseVar is DerivedClass) 
     { 
      var derivedVar = (DerivedClass)baseVar; 

      derivedVar.Field = 1; 

      baseVar = derivedVar; 
     } 
    } 
} 

Ich habe eine Menge Code wie dies in if-Bedingungen. Gibt es eine Kurzversion davon, so dass ich keine temporäre abgeleitete Variable erstellen muss?

+2

Beachten Sie, dass diese Art von Code als Code-Geruch bezeichnet wird. Versuchen Sie, eine gemeinsame Schnittstelle oder Basisklasse zu finden, um allgemeine Klassen zu kombinieren und versuchen Sie, diese Schnittstelle zu verwenden. Es ist weniger fehleranfällig und verringert den Wartungsaufwand. – ckruczek

Antwort

3

Eine Möglichkeit wäre sicher eine Schublade gesteckt:

BaseClass base = new DerivedClass(); 
DerivedClass derived = base as DerivedClass; 
derived?.Field = 1; 

Hinweis: as ist sicher Guss - das wird entweder gegossen oder null zurück. ? ist ein C# 6-Feature, bei dem die Methode oder die Zuweisung ausgeführt wird, wenn die Variable keine nullPtr ist. Sie müssen baseVar = derivedVar nicht schreiben, da beide durch Referenz gebunden sind. Wenn Sie das Feld umwandeln und ändern, hat sich die Referenz überhaupt nicht geändert.

Auch hier ist ein MSDN-Artikel auf null Ausbreitung in C# 6.0 https://msdn.microsoft.com/de-de/magazine/dn802602.aspx

Aus Gründen der Compliance, das ist die veriant OP gewählt:

BaseClass base = new DerivedClass(); 
(base as DerivedClass)?.Field = 1; 
+2

oder immer kürzer: '(Basis als DerivedClass) ?. Field = 1;' ... –

+0

Ich wollte es im Sinne des gegebenen Beispiels behalten. Kurz ist schön, aber ich denke, für Wartungsfreundlichkeit und Klarheit scheint das Ziehen dieses Bits viel klarer zu sein (und hoffentlich wird es vom Compiler sowieso zu Ihrer Lösung optimiert). Aber ich stimme zu, das funktioniert auch. –

+0

Vielen Dank! Ich werde mit @ZoharPeleds Kommentar oben gehen! (Ich habe mehrere hundert solcher Ausdrücke, derzeit alles in Wenn-Bedingungen eingewickelt. Je kürzer, desto besser für den Moment :) – user5997884

1

Die Zuordnung

baseVar = derivedVar; 

ist redundant, so können Sie einfach

if(baseVar is DerivedClass) { 
    ((DerivedClass)baseVar).Field = 1; 
} 
tun
+0

Danke! Ich dachte, Casting würde zu einer temporären Variable führen, die sofort verworfen wird, wenn sie nicht zugewiesen wird? Scheint, ich habe mich geirrt – user5997884

+0

Es wird sein. Die Variable speichert jedoch nur die Referenz - nicht die gesamten Daten des Objekts. Das Verwerfen der Referenz führt nicht zu Rückwürfen der Änderungen am Objekt. –

+0

Also, das ist anders als C/C++ dann? – user5997884

Verwandte Themen