In C # tauchten all diese magischen Methoden auf, ohne von einer Schnittstelle gesichert zu werden. Warum wurde das gewählt?
Lassen Sie mich erklären.
Wenn in C # zuvor ein Objekt die IEnumerableSchnittstelle implementiert hatte , konnte es automatisch von einer foreachSchleife durchlaufen werden . Das macht für mich Sinn, da es durch eine Schnittstelle gesichert ist und wenn ich meine eigene IteratorFunktion innerhalb der Klasse hätte, die durchlaufen wird, könnte ich das tun, ohne mir Sorgen zu machen, dass es auf magische Weise etwas anderes bedeuten würde.
Nun, anscheinend (nicht sicher wann), werden diese Schnittstellen nicht mehr benötigt. Es müssen nur die richtigen Namenskonvertierungen vorhanden sein.
Ein weiteres Beispiel besteht darin, ein Objekt durch eine Methode mit einem genauen Namen zu warten , GetAwaiter die einige bestimmte Eigenschaften aufweist.
Warum nicht eine Schnittstelle erstellen, wie sie es mit dieser "Magie" gemacht hat IEnumerableoder INotifyPropertyChangedum sie statisch zu sichern?
Weitere Details zu dem, was ich hier meine:
http://blog.nem.ec/2014/01/01/magic-methods-c-sharp/
Was sind die Vor- und Nachteile magischer Methoden? Gibt es irgendwo im Internet etwas darüber, warum diese Entscheidungen getroffen wurden?
async/ benötigen, awaitfunktioniert dies nur mit Code, der geschrieben wurde, nachdem .NET 4.5 weit genug verbreitet wurde, um ein brauchbares Ziel zu sein. Dies ist im Grunde genommen jetzt der Fall. Aber eine rein syntaktische Übersetzung in Methodenaufrufe ermöglicht es mir await, vorhandene Typen nachträglich zu erweitern.
foreachanfangs als Basisfunktionalität für eine Schleife implementiert . Es nie wurde für das Objekt eine Anforderung zur Umsetzung IEnumerablefür foreachzu arbeiten. Es war nur eine Konvention, dies zu tun.