Feb19Foto Jan-Hendrik Röhrs

Aus der Praxis – Einfach mal abkürzen

verfasst von am 19-Feb-10, 10:23:32 - 0 Kommentare
Kategorie: .NET Entwicklung

Einige Möglichkeiten, die die C# Syntax schon eine ganze Weile bietet, sind gar nicht so bekannt, wie es ihre Nützlichkeit rechtfertigen würde. Daher möchte ich heute zwei dieser Syntax-Namenlosen vorstellen.

Das doppelte Fragezeichen ??

Während der Fragezeichen-Doppelpunkt-Operator (Conditional operator) sehr bekannt (und auch umstritten) ist, kennen wenige das doppelte Fragezeichen (Null-Coalesce operator, seit C# 2.0). Schade, denn es kürzt eine häufig vorkommende Abfrage ab:

return maybeNull != null ? maybeNull : "leider leer";
// bzw.
if (maybeNull != null) { return maybeNull; } else { return "leider leer"; }

Das obenstehende Beispiel könnte ganz einfach so ausgedrückt werden:

return maybeNull ?? "leider leer";

Das dies auch beim casten sehr sinnvoll sein kann, zeigt das folgende Beispiel (http://stackoverflow.com/questions/464525/how-to-serialize-an-ilistt):

public List<Asset> GetAllAssets()
{
    // ...
    // IList<T> QueryForList<T>(string statementName, object parameterObject); 
    var data = mapper.QueryForList<Asset>(statement, parameters); 
    return data as List<Asset> ?? new List<Asset>(data);
}

Die Deklaration der Methode QueryForList sieht das Interface IList als Rückgabetyp vor. Tatsächlich zurückgegeben wird ein List-Objekt. Um auf jeden Fall ein List-Objekt zu erreichen (auch wenn ggf. eine andere IList-Implementierung zurückgegeben wird), wird zuerst geprüft, ob sich “data” auf List casten lässt. Ist dies der Fall, wird es gecastet zurückgegeben, ansonsten wird ein neues List-Objekt mit den Daten initialisiert und zurückgegeben.

Geschwungene Klammern hinter dem Konstruktor-Aufruf {}

Wenn man Objekt mit möglichst nur einer Zeile erstellen und einer Liste hinzufügen will, ist es oft ärgerlich, wenn es keinen Konstruktor gibt, der genau die Parameter abbildet, die man setzen will.

Asset myAsset = new Asset (123);
myAsset.DisplayName = "Notebook";
myAsset.Manufacturer = "Dell";
assetList.Add(myAsset);

Mit den geschwungenen Klammern hinter dem Konstruktor-Aufruf (Object initializers, seit C# 3.0) kann hier geholfen werden, mit ihnen lassen sich öffentliche Felder und Eigenschaften setzen:

assetList.Add(new Asset(123) {
    DisplayName = "Notebook",
    Manufacturer = "Dell"
});

So wird nicht nur Schreibarbeit gespart (Intellisense bietet innerhalb der geschwungenen Klammern automatisch die öffentlichen Felder und Eigenschaften der Klasse an), sondern auch die Referenz myAsset gar nicht erst angelegt.

Hat die Klasse auch einen Standardkonstruktor, können die runden Klammern beim Konstruktor-Aufruf auch ganz eingespart werden, es folgen direkt die geschwungenden Klammern auf den Konstruktornamen.

Mit Collection initializers lässt sich dieses Prinzip auch auf Sammlungen anwenden, z.B.:

List<string> list = new List<string> {"Claudia", "Tobias", "Andreas"};
// ist doch viel netter als
List<string> list = new List<string>();
list.Add("Claudia");
list.Add("Tobias");
list.Add("Andreas");

Alles kein Zauberwerk, aber im täglichen Einsatz möchte ich diese kleinen Helfer nicht mehr missen.


[zurück]
 

Es gibt 0 Kommentare zum Thema


    Kommentar abgeben:

    Name:
    URL:
    E-Mail:
    Kommentar:
    Validierung: Bitte geben Sie die sechs Ziffern ein.