Warning: Constant ABSPATH already defined in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php on line 28 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 Warning: Cannot modify header information - headers already sent by (output started at /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-config.php:28) in /customers/e/7/0/florian-oeser.de/httpd.www/wordpress/wp-includes/rest-api/class-wp-rest-server.php on line 1723 {"id":217,"date":"2009-02-17T22:01:23","date_gmt":"2009-02-17T21:01:23","guid":{"rendered":"http:\/\/www.florian-oeser.de\/?p=217"},"modified":"2009-06-18T18:39:31","modified_gmt":"2009-06-18T17:39:31","slug":"howto-textlokalisierung-mit-extension-methods","status":"publish","type":"post","link":"http:\/\/www.florian-oeser.de\/2009\/02\/17\/howto-textlokalisierung-mit-extension-methods\/","title":{"rendered":"HowTo: Extension Methods"},"content":{"rendered":"

Dieses How-To wurde ebenfalls auf XNA.mag<\/a> ver\u00f6ffentlicht und kann auch dort diskutiert werden.
\n<\/em><\/p>\n

Einleitung<\/h4>\n

In diesem kleinen How-To m\u00f6chte kurz erkl\u00e4ren was Extension Methods sind, wie man sie anwendet und auf was man achten muss.<\/p>\n

Umsetzung<\/h4>\n

Was sind \u00fcberhaupt Extension Methods?<\/h5>\n

Extension Methods sind integraler Bestandteil von C# 3.0 und dem .Net-Framework\u00a0 3.5!Diese Methoden erlauben es vorhandene Typen zu erweitern, ohne eine abgeleitete Klasse zu implementieren oder den urspr\u00fcnglichen Typ erneut kompilieren zu m\u00fcssen. Extension Methods sind spezielle statische Methoden werden aber wie Instanzmethoden aufgerufen. Instanzmethoden haben aber Vorrang gegen\u00fcber Extension Methods, dass hei\u00dft eine vorhandene Methode kann nicht durch eine Extension Method ersetzt werden. Weiterhin k\u00f6nnen sie nur auf \u00f6ffentliche Member und Methoden des Types den sie erweitern zugreifen, da sie sonst das Prinzip der Kapselung verletzt werden\u00a0 w\u00fcrden.<\/p>\n

Kleines Beispiel gef\u00e4llig?<\/h5>\n
\r\nnamespace ExtensionMethods\r\n{\r\n   public static class Extensions\r\n  {\r\n      public static string EliminateWhiteSpace(this string param)\r\n     {\r\n        return param.Replace(' ', string.Empty);\r\n     }\r\n  }\r\n}\r\n<\/pre>\n

Der erste Paramter in einer Extension Method wird mit dem Operator this<\/em> versehen und entspricht dem Typ auf dem die Extension Method angewendet wird. In diesem Falle string<\/em>. Die Klasse und die eigentliche Methode muss static<\/em> sein.<\/p>\n

Wie verwendet man jetzt diese Methode:<\/p>\n

\r\nusing ExtensionMethods;\r\n\r\nnamespace ConsoleApplication\r\n{\r\n    class Program\r\n   {\r\n      static void Main(string[] args)\r\n      {\r\n         Console.WriteLine("Hallo Welt!".EliminateWhiteSpace());\r\n         Console.ReadLine();\r\n      }\r\n   }\r\n}\r\n<\/pre>\n

Das\u00a0 funktioniert da der Compiler die Extension Methods aufl\u00f6st wenn der Namespace, in dem die Extension Method definiert wurde, an der gew\u00fcnschten Stelle eingebunden wurde.\u00a0 Das Einbinden des Namespaces ist wichtig und muss explizit geschehen. Wie erw\u00e4hnt wird also die Extension Method wie eine Instanzmethode aufgerufen, liegt aber nach dem kompilieren\u00a0 in der IL (intermediate language) als statischer Aufruf vor. Im Endeffekt wird also daraus:<\/p>\n

\r\nConsole.WriteLine(Extensions.EliminateWhiteSpace("Hallo Welt!"));\r\n<\/pre>\n

Ein weiteres Beispiel, welches nicht ganz so konstruiert ist. Bei der Spiele\/Grafikprogrammierung ist es wichtig zu wissen wieviel Zeit zwischen zwei Frames (Bildern) vergangen ist. Das sieht folgenderma\u00dfen aus:<\/p>\n

\r\nfloat dt = (float)gameTime.ElapsedGameTime.TotalSeconds;\r\n<\/pre>\n

Die Extension Method dazu:<\/p>\n

\r\npublic static float GetElapsedSeconds(this GameTime gameTime)\r\n{\r\n    return (float)gameTime.ElapsedGameTime.TotalSeconds;\r\n}\r\n<\/pre>\n

Und nun der neue Aufruf:<\/p>\n

\r\nfloat dt = gameTime.GetElapsedSeconds();\r\n<\/pre>\n

Conclusion<\/h4>\n

Extension Methods bieten eine gute M\u00f6glichkeit vorhande Funktionlit\u00e4t zu erweitern und lassen sich im ‚Client-Code‘ intuitiv einsetzen. Weiterhin verbessert sich zumeist die Lesbarkeit des Codes (syntaktischer Zucker<\/em>). Trotzdem sollte man sparsam mit ihnen umgehen und sie nur anwenden wenn sie unbedingt ben\u00f6tigt werden, da es schnell zu Wildwuchs kommen kann und der Code schlecht wartbar wird.<\/p>\n

Interessante Links\/Quellen<\/h4>\n

MSDN Prgramming Guide zu Extension Methods<\/a><\/p>\n

C# 3.0 Extension Methods<\/a><\/p>\n

Extension Methods und genauerer IL-Betrachtungen<\/a><\/p>\n

Extension Methods in Bezug auf XNA<\/a><\/p>\n

Extension Methods in Bezug auf XNA 2<\/a><\/p>\n

Extension Methods in Bezug auf XNA 3<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"

Dieses How-To wurde ebenfalls auf XNA.mag ver\u00f6ffentlicht und kann auch dort diskutiert werden. Einleitung In diesem kleinen How-To m\u00f6chte kurz erkl\u00e4ren was Extension Methods sind, wie man sie anwendet und auf was man achten muss. Umsetzung Was sind \u00fcberhaupt Extension Methods? Extension Methods sind integraler Bestandteil von C# 3.0 und dem .Net-Framework\u00a0 3.5!Diese Methoden erlauben […]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":[],"categories":[6],"tags":[],"_links":{"self":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/posts\/217"}],"collection":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/comments?post=217"}],"version-history":[{"count":35,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/posts\/217\/revisions"}],"predecessor-version":[{"id":275,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/posts\/217\/revisions\/275"}],"wp:attachment":[{"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/media?parent=217"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/categories?post=217"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.florian-oeser.de\/wp-json\/wp\/v2\/tags?post=217"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}