En C #, j'ai commencé à voir toutes ces méthodes magiques surgir, sans être sauvegardées par une interface. Pourquoi a-t-il été choisi?
Laissez-moi expliquer.
Auparavant en C #, si un objet implémentait l' IEnumerableinterface, il serait automatiquement itérable par une foreachboucle. Cela a du sens pour moi, car il est soutenu par une interface, et si je devais avoir ma propre Iteratorfonction dans la classe en cours d'itération, je pourrais le faire sans craindre que cela signifierait par magie autre chose.
Maintenant, apparemment, (je ne sais pas quand), ces interfaces ne sont plus nécessaires. Il a juste besoin d'avoir les bonnes conversions de noms.
Un autre exemple est de rendre n'importe quel objet attendable en ayant une méthode nommée exactement GetAwaiter qui a quelques propriétés spécifiques.
Pourquoi ne pas créer une interface comme ils l'ont fait avec IEnumerableou INotifyPropertyChangedsauvegarder cette "magie" statiquement?
Plus de détails sur ce que je veux dire ici:
http://blog.nem.ec/2014/01/01/magic-methods-c-sharp/
Quels sont les avantages et les inconvénients des méthodes magiques, et y a-t-il un endroit en ligne où je peux trouver des informations sur les raisons pour lesquelles ces décisions ont été prises?
async/ await, cela ne fonctionnera qu'avec le code qui a été écrit après que .NET 4.5 est devenu suffisamment répandu pour être une cible viable ... ce qui est fondamentalement maintenant. Mais une traduction purement syntaxique en appels de méthode me permet d'ajouter des awaitfonctionnalités aux types existants après coup.
foreachboucle au début. Il n'a jamais été nécessaire que l'objet à implémenter IEnumerablepour foreachfonctionner. C'est juste une convention de le faire.