• Shuffle
    Toggle On
    Toggle Off
  • Alphabetize
    Toggle On
    Toggle Off
  • Front First
    Toggle On
    Toggle Off
  • Both Sides
    Toggle On
    Toggle Off
  • Read
    Toggle On
    Toggle Off
Reading...
Front

Card Range To Study

through

image

Play button

image

Play button

image

Progress

1/8

Click to flip

Use LEFT and RIGHT arrow keys to navigate between flashcards;

Use UP and DOWN arrow keys to flip the card;

H to show hint;

A reads text to speech;

8 Cards in this Set

  • Front
  • Back
Extension Methods
Mit Hilfe von Extension Methods können einer Klasse, die man nicht direkt verändern kann, neue Methoden hinzugefügt werden.

Dafür legt man in einer beliebigen statischen Klasse die gewünschte neue Methode (als statische Methode), in der die gewünschte Funktionalität implementiert ist. Der Methode wird als Parameter ein Objekt der Klasse übergeben, zu der die neue Methode hinzugefügt werden soll. Das Schlüsselwort "this" vor dem Parameter kennzeichnet die Methode als Extension Method für die übergebene Klasse.
Zusätzlich kann die Extension Method beliebeige weitere Parameter haben.

Der Aufruf einer Extension Method erfolgt als ob diese eine herkömmliche Methode der Klasse wäre, d.h. der methodenaufruf erfolgt über die Punktnotation auf einer Instanz der Klasse.

Es ist auch möglich Extension Methods anstatt zu einer konkreten Klasse einem abstrakten Interface hinzuzufügen. Der Aufruf der Extension Method ist dann auf den Instanzen aller Klassen möglich, die das Interface implementieren.

Ein Beispiel für die Anwendung von Extension Methods in C# ist die LINQ-Punktnotation. Methoden wie z.B. "OrderByDescending" sind als Extension-Methods für die vom Entwickler angelegten Klassen vorhanden.
Delegates
Ein Delegate ist eine Variable vom Typ einer Methode. Mit Hilfe eines Delegates kann somit eine komplette Methode als Übergabeparameter in einer (Extension) Methode verwendet werden und unterstützt somit ebenfalls das Prinzip des Loose Couplings.

Dass es sich bei der Variable um ein Delegate handelt, erkennt man an dem Schlüsselwort "Func" in der Typbezeichnung, gefolgt von beleibig vielen Typen in spitzen Klammern. Die Typen beschreiben dabei die Ein- und Ausgabeparameter der Delegate-Methode.

Bei der "Initialisierung" der Delegate-Variable erfolgt die Definition der Delegate-Methode wie jede herkömmliche Methoden-Definition, nur dass anstatt des Methodennamens, der ja bereits über den Namen der Delegate-Variable angegeben ist, das Schlüsselwort "delegate" verwendet wird.

Func<Product, bool> categoryFilter = delegate(Product prod) { return prod.Category == "Soccer"; }

Alternativ kann für die Definition der Delegate-Methode auch die Lamda-Expression verwendet werden. Der Typ der Eingabeparameter muss dabei nicht mit angegeben werden, sondern wird automatisch zugeordnet.

Func<Product, bool> categoryFilter = prod => prod.Category == "Soccer";

Oder bei mehreren Code Satements mit geschweiften Klammern: (prod, count) => { ... return result; }

Nachdem die Delegate-Variable definiert wurde, kann sie lediglich mit ihrem Variablen-Namen als Parameter übergeben werden.
Alternativ kann die Delegate-Definition in Form der Lamda-Expression direkt ohne Variablennamen als parameter übergeben werden.
Object Initializers
Bei der Inizialisierung eines Objekts gibt es die Möglichkeit in geschweiften Klammern die Properties des Objektes direkt mit einem Wert zu belegen ohne erst die Instanz zu bilden und jedes einzelne Property auf der gebildeten Instanz aufzurufen.

Product prod = new Product { Name = "Kajak", Category = "Watersports"};
(Automatic) Type Inference
bzw. Implicit Typing
Bei der Definition einer Variable kann auf eine konkrete Type-Bezeichnung verzichtet werden und stattdessen das Schlüsselwort "var" verwendet werden. Der Compiler leitet den Typ der Variable dann auutomatisch vom weiteren Code ab.

var product = new Product {Name = "Kajak", Category = "Watersports"};
Anonymous Types
Durch die Kombination von Type Inference und Object Initatilizers können wir anonym typisierte Objekte erzeugen, d.h. Objekte ohne explizite Typbezeichnung.

Der Compiler legt sich für diese Objekte selbstständig eine Klasse an, die eindeutig durch die Namen und Typen der angegebenen Parameter gekennzeichnet ist. D.h. dass verschiedene anonymous typed Objects mit identischen Parametern vom compiler mit der selben anonymen Klasse typisiert werden. (Das ermöglicht es auch Arrays von anonymous typed objects anzulegen.)

var product = new { Name = "Kajak", Category = "Watersports"}
Automatically Implemented Properties
...
Language Integrated Queries (LINQ)
LINQ ist eine SQL-Ähnliche Sprache, um Daten in Klassen abzufragen.

LINQ-Abfrage können entweder in der Query Sysntax oder in der Punktnotation formuliert werden, wobei die Punktnotation auf Extension Methods basiert und den größeren Funktionsumfang hat. Die Punktnotation wird häufig mit Lamda-Expression kombiniert.

var results = products.OrderByDescending( p => p.Price).Take(3);

Es gibt Deferred ("hinausgezögerte") LINQ Queries, die erst in dem Moment ausgeführt werden, wenn man auf das Ergenis zugreift. Änderungen am Ausgangsobjekt, die nach der LINQ-Abfrage getätigt werden, gehen deshalb in das Ergebnis mit ein.
Möchte man diese Verzögerung nicht haben, so kann man eine nicht-deffered-Abfrage (wie z.B. toList) anhängen. Dann wird die Abfrage sofort ausgewertet.
Razor
Razor ist die neue View Engine seit MVC 3. Sie generiert .cshtml-Seiten und verwendet das @-Symbol, um speziellen Razor-Code bzw. C#-Code in den Html-Code der View zu integrieren.

Die alte ASPX View Engine von ASP.NET kann neben Razor weiterhin verwendet werden. Sie generiert .aspx-Seiten und verwendet die Elemente <% und %> für die Integration von speziellen Befehlen in den Html-Code der View.

Spezielle Razor-Befehle:

Mit @model Razor.Models.Product wird der Typ des Models angegeben, das der View vom Controller übergeben wird.

Mt @Model kann auf das übergebene Model und mittels der Punktnotation (z.B. @Model.Name) auf seine Properties zugegriffen werden.

Einzelne C#-Statements können durch Voranstellen des @-Symbols in die Seite integriert werden. Z.B.
@if(Model.Category == "Watersports") {
...some html here ....
}

Mehrere C#-Statements in Folge können auch innerhalb eines Code-Blocks in die View integriert werden. Ein Code-Block wird gekennzeichnet durch ein öffnendes @{ und ein schließendes }.

Einzelne Zeilen von Text innerhalb eines Code-Blocks oder eines einzelnen Code-Statements können durch ein vorangestelltes @: Symbol als solche gekennzeichnet werden. (Das ist eine Alternative zu <text> </text>Tags.)

Das ViewBag Feature ist (sehr ähnlich zum ViewData Feature) neben dem Übergeben eines befüllten Models eine weitere Möglichkeit, um Daten vom Controller in die View zu transportieren. ViewBag ist ein dynamischer Typ, d.h. dass ihm Properties hinzugefügt werden können, indem diesen ein Wert zugewiesen wird. Also z.B. ViewBag.NumberOfDays = 5;
Die ViewBag-Properties können in der View mittels @ViewBag.NumberOfDays abgerufen werden.

"Layouts" in Razor:
Im Views/Shared-Ordner wird automatisch eine Art Masterpage mit dem Namen _Layout.cshtml angelegt. Diese enthält Elemente, die für alle Views gleich sind und nicht dupliziert werden sollen, wie z.B. die html-, head- und body-Tags, aber auch CSS-Vorlagen und JavaScript-Libraries.
Beim Aufruf einer beliebigen View wird die Layout-Page gerendert und dabei @RenderBody() mit dem Code der aufgerufenen View ersetzt.
Welche Seite als Layout-Page verwendet wird, ist in _ViewStart.cshtml angegeben:
@{
Layout = "..."
}
Auf diesen Mechanismus wird verzichtet, wenn innherhalb der Aufgerufenen View Layout auf null gesetzt wird. In diesem Fall wird lediglich die tatsächlich aufgerufene Seite gerendert.