Think First Development

Erst denken, dann programmieren

Durchsuche Beiträge mit Schlagwörtern Extension Method

In einem Kommentar einer meiner Blogeinträge kam die Frage auf, ob man nicht eine Extension Method für das ‘??’-Konstrukt machen kann. Da habe ich mir die Frage gestellt, ob das überhaupt geht. Denn letztlich würde ja eine Methode auf einem Null-Objekt aufgerufen. Hier ein bißchen Code um den Sachverhalt zu verdeutlichen.


    public class Program
    {
        static void Main(string[] args)
        {
            // NULL-String deklarieren
            string str = null;
            // Funktioniert NICHT, da es eine Klassenmethode ist
            var bar = str.Contains("elo");

            // Funktioniert, da es eine Extension Method ist
            var foo = str.IfIsNull("Hello");
            // Funktioniert auch! isFoo == "foo"
            var isFoo = ((string)null).IfIsNull("foo");
        }
    }

    internal static class StingExtension
    {
        public static string IfIsNull(this string hello, string alternateText)
        {
            if (hello == null) return alternate;
            return hello;
        }
    }

Aber warum funktioniert das? Weder erscheint eine Compiler Fehlermeldung, noch der ReSharper jammert und zur Laufzeit wird auch keine Exception geworfen. Der Grund liegt in der Übersetzung von Extension Methods durch den Compiler. Eine Extension Method erscheint zwar als Klassenmethode, wird aber durch den statischen Aufruf der Methode ersetzt. Und eine statischer Methodenaufruf ist für Null-Objekte möglich und die Prüfung innerhalb der Methode verhindert die Exception. Damit wirft der Aufruf einer Extension Method auf “Null”-Objekte keine NullReferenceException. Klingt komisch, ist aber so.

Ich habe mich endlich mal mit den Extension Methods von C# auseinander gesetzt. Das ist ja um vieles einfacher als ich dachte ;) Hier mal ein kleines Beispiel, das den String Datentyp um eine Methode “ToInt32()” erweitert. weiter lesen

Powered by WordPress Web Design by SRS Solutions © 2010 Think First Development Design by SRS Solutions