{"id":262,"date":"2011-05-17T22:20:46","date_gmt":"2011-05-17T20:20:46","guid":{"rendered":"http:\/\/www.steffen-liersch.de\/content\/de\/?p=262"},"modified":"2025-03-02T11:30:57","modified_gmt":"2025-03-02T10:30:57","slug":"cs-extension-methods","status":"publish","type":"post","link":"https:\/\/www.steffen-liersch.de\/content\/de\/2011\/05\/cs-extension-methods\/","title":{"rendered":"Erweiterungsfunktionen in C# 3.0"},"content":{"rendered":"<p>Erweiterungsfunktionen werden ab C# 3.0 unterst\u00fctzt. Sie erm\u00f6glichen das nachtr\u00e4gliche Hinzuf\u00fcgen von Member-Funktionen zu Klassen und Schnittstellen.<\/p>\n<p>Versiegelte Klassen k\u00f6nnen ebenso erweitert werden, wie Klassen anderer Assemblies. Erweiterungsfunktionen k\u00f6nnen bestehende Funktionen nicht \u00fcberschreiben oder verdecken. Bestehende Funktionen haben gegen\u00fcber Erweiterungsfunktionen Vorrang.<!--more--><\/p>\n<p>Um Erweiterungsfunktionen nutzen zu k\u00f6nnen, muss der Namensraum der Klasse, die die gew\u00fcnschten Funktionen enth\u00e4lt, mit Hilfe der using-Klausel eingebunden werden.<\/p>\n<h2>Besonderheiten<\/h2>\n<p>Erweiterungsfunktionen werden immer als statische Funktion realisiert. Daher ist ein Aufruf \u00fcber null-referenzierte Objekte prinzipiell m\u00f6glich. Dies steht jedoch im Gegensatz zu echten Member-Funktionen, die selbst dann nicht \u00fcber Null-Referenzen aufgerufen werden k\u00f6nnen, wenn sie gar keine Member-Elemente benutzen.<\/p>\n<h2>Einsatzgebiete<\/h2>\n<p>Der Einsatz von Erweiterungsfunktionen sollte wohl\u00fcberlegt werden. Die Benutzung einer Erweiterungsfunktion ist in Bezug auf die implementierende Klasse immer implizit. Es ist also im Quellcode nicht erkennbar, dass es sich beim Aufruf einer Erweiterungsfunktion um eine solche handelt.<\/p>\n<p>Funktionen f\u00fcr Listen bestimmter Elemente als Erweiterungsfunktionen zu realisieren, schafft sehr viele Vorteile. Die folgende Erweiterungsfunktion wird f\u00fcr alle Listen bereitgestellt, die IList&lt;GraphicObject&gt; implementieren. Sie steht dadurch automatisch f\u00fcr typisierte Arrays, Listen und Kollektionen zur Verf\u00fcgung.<\/p>\n<pre><code class=\"cs\">public static int DoSomething(this IList collection);<\/code><\/pre>\n<p>Beim Implementieren muss nicht mehr bekannt sein, welche Klasse die Erweiterungsfunktion bereitstellt, da die Funktion automatisch f\u00fcr alle mit IList&lt;GraphicObject&gt; kompatiblen Objekte angeboten wird.<\/p>\n<p>Ein weiteres Beispiel f\u00fcr die sinnvolle Verwendung von Erweiterungsfunktionen ist der Einsatz f\u00fcr h\u00e4ufig benutzte Klassen. Beispielsweise bietet sich die Erweiterung der Klasse String mit individuell ben\u00f6tigten Funktionen an.<\/p>\n<p>Erweiterungsfunktionen stellen in .NET die Grundlage f\u00fcr LINQ (Language Integrated Query) dar.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Erweiterungsfunktionen werden ab C# 3.0 unterst\u00fctzt. Sie erm\u00f6glichen das nachtr\u00e4gliche Hinzuf\u00fcgen von Member-Funktionen zu Klassen und Schnittstellen. Versiegelte Klassen k\u00f6nnen ebenso erweitert werden, wie Klassen anderer Assemblies. Erweiterungsfunktionen k\u00f6nnen bestehende Funktionen nicht \u00fcberschreiben oder verdecken. Bestehende Funktionen haben gegen\u00fcber Erweiterungsfunktionen Vorrang.<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5],"tags":[21,25,32],"class_list":["post-262","post","type-post","status-publish","format-standard","hentry","category-net","tag-net","tag-cs","tag-linq"],"_links":{"self":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/262","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/comments?post=262"}],"version-history":[{"count":11,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/262\/revisions"}],"predecessor-version":[{"id":520,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/posts\/262\/revisions\/520"}],"wp:attachment":[{"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/media?parent=262"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/categories?post=262"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.steffen-liersch.de\/content\/de\/wp-json\/wp\/v2\/tags?post=262"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}