32 Stimmen

Nachteile der Verlängerungsmethoden?

Die Erweiterungsmethode ist eine wirklich hilfreiche Funktion, mit der Sie viele Funktionen in jeder Klasse hinzufügen können. Aber ich frage mich, ob es einen Nachteil gibt, der mir Probleme bereiten könnte. Irgendwelche Kommentare oder Vorschläge?

0voto

Patrick Nguyen Punkte 41

Es fällt mir schwer, mir vorzustellen, eine Methode hinzuzufügen, ohne den bestehenden Code genau zu kennen. Wenn Sie zum Beispiel eine Klasse eines Drittanbieters verwenden, um etwas zu tun, warum sollten Sie dann die Funktionalität dieser Klasse erweitern, wenn Sie nicht der ursprüngliche Entwickler sind und keine Ahnung haben, wie die Klasse aufgebaut ist? Es ist fast sinnlos, so etwas zu tun, so wie es sinnlos ist, Auto zu fahren, wenn man nichts sehen kann. Im Fall von LINQ, wo es von Microsoft-Designern/Codes implementiert wird, macht es sehr viel Sinn, da sie das Wissen besitzen, wie z. B. eine interne Implementierung einer Sequenz und jetzt wollen sie die Funktionalität erweitern, indem sie die Count-Methode hinzufügen, um alle Elemente in der Sequenz zu zählen. Ich wünschte, jemand würde mir das Gegenteil beweisen, indem er ein realistisches Beispiel nennt, in dem eine Erweiterungsmethode benötigt wird.

0 Stimmen

Ein einfaches Beispiel wäre das Hinzufügen einer "IsNullOrWhiteSpace()"-Erweiterungsmethode für Strings.

0voto

Mukesh Adhvaryu Punkte 630

Es gibt zwei verschiedene Szenarien, in denen Erweiterungsmethoden ins Spiel kommen:

  1. Wenn Sie eine beliebige Klasse, Struktur oder Schnittstelle erweitern wollen, die aus einer externen Assembly stammt, mit Ausnahme der Klassen, die nicht als versiegelt gekennzeichnet sind, bei denen Sie die Möglichkeit haben, von diesen Klassen abzuleiten und sie mit zusätzlichen Methoden zu erweitern, steht Ihnen nur diese Option zur Verfügung, ich wiederhole: nur diese. Versiegelte Klassen und Strukturen können nicht vererbt werden, von Schnittstellen ganz zu schweigen.
  2. In Ihrer eigenen Assembly ist die Bereitstellung einer Erweiterungsmethode für eine bestimmte Klasse, Struktur oder Schnittstelle jedoch eine sehr subjektive Angelegenheit. Wenn Sie für die Benutzer Ihrer Assembly generisch sein wollen, können Sie sehr kleine Schnittstellen mit idealerweise nur wenigen Eigenschaften erstellen und dann eine ganze Reihe von Erweiterungsmethoden an sie anhängen. Hier ist das Beispiel:

    public interface IPointF{
        float X { get; }
        float Y { get; }
    }
    
    public struct PointF: IPointF{
        public PointF(float x, float y){
            X=x;Y=y;
        }
        public float X { get; private set; }
        public float Y { get; private set; }
    }
    
    public static class PointHelper{
        public static PointF ADD(this IPointF p, float val){
            return new PointF(p.x+val, p.y+val);
        }
    }

So kann jeder zukünftige Benutzer viel Zeit bei der Codierung sparen, indem er IPoint erbt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X