Nach dem, was ich über Erweiterungsmethoden gelesen habe, werden Sie Probleme bekommen, wenn die Basisklasse beschließt, eine Methode mit demselben Namen wie Ihre Erweiterung hinzuzufügen. Für eine bestimmte Klasse ist es normalerweise nicht schwierig, einen Namen zu wählen, um Konflikte zu vermeiden, jedoch können Erweiterungsmethoden zu Schnittstellen hinzugefügt werden, was unendlich mehr Konfliktpotential hinzufügt.
In Objective-C (mit ihrer Version, Kategorien) wird dieses Problem vermieden, indem vor jeder Methode ein Präfix hinzugefügt wird. Ich weiß, dass wir Erweiterungsmethoden in Namespaces definieren können, so dass wir kontrollieren können, ob sie importiert werden oder nicht, aber dies löst nur das Problem von Konflikten zwischen Erweiterungsmethoden und nicht zwischen einer Erweiterungsmethode und der Basisklasse.
Aktualisierung:
Niemand hat das tatsächlich erwähnt, aber die Erweiterungsmethoden sind nicht virtuell . Das heißt, wenn Sie i.myExtension () auf einer Schnittstelle i ausführen können, ruft sie immer die Methode interface classes auf, so dass die Methode der Unterklasse (die eine andere Absicht haben könnte) nicht aufgerufen wird. Insgesamt ist die Verwendung von Erweiterungsmethoden ziemlich sicher.
Die Verwendung eines Präfixes wird den Code hässlich machen, was etwas von dem Wert einer Erweiterungsmethode entfernt.
Ich empfehle stattdessen, darauf zu achten, keine große Anzahl von Erweiterungsmethoden zu erstellen und sinnvolle Methodennamen zu verwenden. Auf diese Weise ist es im Falle eines Konflikts wahrscheinlicher, dass zum Beispiel die Erweiterung Where
-Methode und die in Konflikt stehende Where
-Methode eine ähnliche Semantik haben.
Die allgemeine Konvention besteht darin, sie in einem eigenen separaten Namespace (normalerweise in der Form <something>.Extensions
) zu haben, mit dem Sie entscheiden können, ob Sie sie in einem bestimmten Codeabschnitt verwenden, der normalerweise die Typen der Erweiterungen enthält weitermachen.
Wenn Sie einen Konflikt haben, denken Sie daran, dass Erweiterungsmethoden immer noch statische Methoden sind, sodass Sie sie im Falle eines Namenskonflikts immer explizit aufrufen können.
Wenn Sie jedoch feststellen, dass häufig Namenskonflikte auftreten, sollten Sie die Namen, die Sie auswählen, überdenken, damit sie die bereits vorhandenen Namen nicht stören.
Zusammenfassend no sollten Sie die Namen der Erweiterungsmethoden in C # nicht als Präfix verwenden, da sie nur dazu dienen, Ihren Code zu verschleiern und die Pflege schwieriger zu machen.
Wenn die Basisklasse eine Methode mit demselben Namen wie Ihre Erweiterung implementiert, würde ich vermuten, dass Sie eines dieser beiden Szenarien haben:
Ich bin geneigt, nein zu sagen, sie sollten nicht, außer Sie haben einen guten Grund zu vermuten, dass die von Ihnen verwendete Methodensignatur implementiert wird. Der Grund, warum ich das denke, ist ...
Normalerweise wähle ich bei der Implementierung von Erweiterungsmethoden normalerweise relativ ausführliche Methodennamen, um Verwechslungen zu vermeiden.
Tags und Links c#