Pourquoi C# n'est pas en permettant à des non-membres, comme les fonctions C++
C# ne permettra pas à écrire non des fonctions de membre et de chaque méthode doit être une partie d'une classe. Je pensais à cela comme une restriction dans toutes les CLI langues. Mais j'ai eu tort et j'ai trouvé que le C++/CLI soutient les fonctions de membre. Lorsqu'il est compilé, le compilateur va faire de la méthode en tant que membre de certains sans nom de la classe.
Ici est ce que le C++/CLI standard dit,
[Note: les fonctions de membre sont traités par la CLI en tant que membres de certains sans nom de la classe; toutefois, en C++/CLI code source, ces fonctions ne peuvent pas être qualifiés de manière explicite avec un nom de classe. la note de fin]
L'encodage des non-membres en fonctions dans les métadonnées n'est pas spécifié. [Note: Cela ne cause pas de problèmes d'interopérabilité, car ces fonctions ne peuvent avoir une visibilité publique. la note de fin]
Donc ma question est pourquoi ne pas C# mettre en place quelque chose comme ça? Ou pensez-vous qu'il ne devrait pas être non-fonctions de membre et de chaque méthode doit appartenir à une classe?
Mon avis est non-membre de la fonction de soutien et aide à éviter la pollution de la classe de l'interface.
Toutes les pensées..?
- Belle question. Je me suis demandé la même chose. +1
- F# prend également en charge les méthodes sans explicite de la classe (et crée ensuite un nom à partir du nom de fichier pour l'implicite de la classe).
- Bonne question. Le C# est un têtu langue!
Vous devez vous connecter pour publier un commentaire.
Voir ce blogue:
http://blogs.msdn.com/ericlippert/archive/2009/06/22/why-doesn-t-c-implement-top-level-methods.aspx
et ce suivi de poster:
http://blogs.msdn.com/ericlippert/archive/2009/06/24/it-already-is-a-scripting-language.aspx
(l'accent du texte original)
using static NameSpace.ClassName;
pour ensuite être en mesure d'appelerFunction(arg1, arg2, ...)
une bonne alternative ou est-ce que quelqu'un que l'on doit éviter en général (j'.e pas un "best/pratique recommandée")? Peut-être il y a une autre "meilleure" option pour atteindre le but?C# ne pas l'accepter parce que Java ne le permettaient pas.
Je peux penser à plusieurs raisons pourquoi les concepteurs de Java n'a probablement pas permettre
Comme je l'ai déjà dit dans les commentaires, je pense que c'est une bonne question, et il ya beaucoup de cas où des non-fonctions de membre aurait été préférable. (cette partie est surtout une réponse à toutes les autres réponses en disant: "vous n'en avez pas besoin")
En C++, où le non-fonctions membres sont autorisés, ils sont souvent privilégiées, pour plusieurs raisons:
std::find
ou std::sort` en tant que non-membre de fonctions, de sorte qu'ils peuvent être réutilisés sur tout type de séquences, si c'est des tableaux, des jeux, des listes liées, ou (pour les std::find, au moins) des flux. La réutilisation de Code est également une partie importante de la programmation orientée objet.find
fonction n'a pas besoin de savoir à propos de la classe LinkedList afin d'être en mesure de travailler sur elle. Si elle avait été définie comme une fonction membre, il serait un membre de la classe LinkedList, fondamentalement, la fusion des deux concepts dans un grand blob.La capacité des non-fonctions de membre peut avoir commencé avec le C (où vous n'aviez pas d'autre choix), mais en C++ moderne, il est une caractéristique essentielle dans son propre droit, et pas seulement pour l'arrière pour des fins de comparabilité, mais en raison de la plus simple, plus propre et plus de code réutilisable en il permet.
En fait, C#, semble avoir atteint un peu les mêmes choses, beaucoup plus tard. Pourquoi pensez-vous que les méthodes d'extension ont été ajoutés? Ils sont une tentative dans le sens de ce qui précède, tout en préservant la simple Java syntaxe.
Les Lambdas sont également des exemples intéressants, comme ils sont aussi essentiellement de petites fonctions définies librement, non pas comme membres d'une catégorie donnée. Alors oui, le concept de non-fonctions de membre est utile, et C#'s les concepteurs ont réalisé la même chose. Ils ont juste essayé de se faufiler le concept par la porte arrière.
http://www.ddj.com/cpp/184401197 et http://www.gotw.ca/publications/mill02.htm sont deux articles écrits en C++ des experts sur le sujet.
==
comparaisons.Non des fonctions de membre sont une bonne chose parce qu'ils améliorent l'encapsulation et de réduire le couplage entre les types. La plupart des langages de programmation modernes comme Haskell et F nombre de fonctions libres.
Quel est l'avantage de pas mettre chaque méthode dans une classe nommée? Pourquoi un non-membre de la fonction de "polluer" la classe de l'interface? Si vous ne voulez pas cela comme une partie de l'API publique de la classe, soit ne pas la rendre publique ou de ne pas la mettre dans cette classe. Vous pouvez toujours créer une classe différente.
Je ne me souviens jamais vouloir écrire une méthode flottant autour sans portée - autres que les fonctions anonymes, bien sûr (qui ne sont pas vraiment les mêmes).
En bref, je ne vois pas d'avantages en situation de non-fonctions de membre, mais je peux voir les avantages en termes de cohérence, de nommage et de la documentation afin de mettre toutes les méthodes en conséquence d'une classe nommée.
Le CLS (common language specification) dit que vous ne devriez pas avoir de non-fonctions de membre dans une bibliothèque qui est conforme à la CLS. C'est comme un jeu supplémentaire de restrictions en plus des restrictions de base de la CLI (common language interface).
Il est possible qu'une future version de C# va ajouter de la capacité à rédiger un
using
directive qui autorise les membres statiques d'une classe à être accessibles sans le nom de la classe de qualification:Alors il n'y aura pas besoin de changer les CLS et les bibliothèques existantes.
Ces billets de blog démontrer une bibliothèque pour la programmation fonctionnelle en C#, et ils utilisent un nom de classe est juste une lettre, d'essayer et de réduire le bruit causé par la nécessité de qualifier les méthodes statiques. Des exemples comme ça aurait fait un peu plus agréable si
using
directives pourraient classes de cibles.Depuis Java, la plupart des programmeurs ont facilement accepté que toute méthode est un membre d'une classe. Je ne veut pas faire de considérables obstacles et de rendre le concept de méthode plus étroite, qui en font une langue plus facile.
Cependant, en effet, la classe déduit de l'objet, et l'objet déduit de l'état, de sorte que le concept de classe ne contenant que des méthodes statiques semble un peu absurde.
Je pense que vous avez vraiment besoin de préciser ce que vous souhaitez créer non-membre statique méthodes pour les réaliser.
Par exemple, certaines des choses que vous pourriez vouloir pour peut être gérée avec Les Méthodes D'Extension
Un autre exemple d'utilisation (d'une classe qui contient des méthodes statiques) est dans une bibliothèque. Dans ce cas, il n'y a que peu de mal dans la création d'une classe dans une assemblée qui est entièrement composé de méthodes statiques. Il les tient ensemble, d'éviter les conflits de noms. Après tout, il y a des méthodes statiques en Mathématiques qui servent le même but.
Aussi, vous ne devez pas nécessairement comparer C++de modèle d'objet avec C#. C++ est en grande partie (mais pas tout à fait) compatible avec le C, qui n'ont pas un système de classe à tous - C++ eu à l'appui de cette programmation à l'idiome de la C héritage, pas pour tout modèle particulier impératif.
Porter quelque chose à l'esprit: C++ est beaucoup plus compliqué que la langue que C#. Et même s'ils peuvent être identiques du point de vue syntaxique, ils sont très différents des bêtes point de vue sémantique. Vous ne pensez pas qu'il serait terriblement difficile de faire un changement comme ça, mais j'ai pu voir comment il pourrait être. ANTLR a une bonne page wiki appelée Ce qui fait d'un problème de langue difficile? c'est bon de consulter pour ce genre de questions. Dans ce cas:
Maintenant, au lieu de juste se soucier de fonctions définies dans les classes, nous devons nous inquiéter les fonctions définies à l'extérieur des classes. Sur le plan conceptuel, il n'y a pas beaucoup de différence. Mais en termes de lexing et de l'analyse du code, vous avez maintenant la difficulté supplémentaire d'avoir à dire "si une fonction est en dehors de la classe, il appartient à cette classe sans nom. Toutefois, si elle est à l'intérieur de la classe, alors il appartient à cette classe."
Aussi, si le compilateur arrive sur une méthode comme ceci:
...il a maintenant de répondre à la question "est un Bar situé à l'intérieur de cette classe ou est-il un groupe?"
C'est une autre chose qui provoque des problèmes. Rappelez-vous que le C# n'exige pas de déclaration. Le compilateur va faire une passe juste à déterminer quelles classes sont nommées et quelles sont les fonctions de ces classes contiennent. Maintenant, vous avez à vous soucier de trouver des classes de et les fonctions où les fonctions peuvent être soit à l'intérieur ou à l'extérieur d'une classe. C'est quelque chose d'un analyseur C++ n'avez pas à vous inquiéter qu'il analyse tout dans l'ordre.
Maintenant, ne vous méprenez pas, il pourrait être fait en C#, et je serais probablement utiliser une telle fonctionnalité. Mais est-ce que ça vaut la peine de surmonter ces obstacles lorsque vous tapez juste le nom d'une classe en face d'une méthode statique?
Gratuit fonctions sont très utiles si vous les combinez avec du duck-typing. L'ensemble de C++ STL est basée sur elle. Donc je suis sûr que C# va introduire la libre fonctions lorsqu'ils parviennent à ajouter un vrai génériques.
Comme l'économie, la langue de conception est également à propos de la psychologie. Si vous créez de l'appétit pour le vrai génériques par l'intermédiaire des fonctions en C# et ne pas les fournir, vous devez tuer C#. Ensuite, tous les développeurs C# serait passer à C++ et personne n'en veut, pas le C# de la communauté et certainement pas ceux qui ont investi dans C++.
Alors c'est vrai vous besoin d'une classe (par exemple, une classe statique appelé
FreeFunctions
) à détenir de telles fonctions, vous êtes libre de les placerusing static FreeFunctions;
en haut de n'importe quel fichier qui a besoin de l'fonctions, sans avoir à litière de votre code avecFreeFunctions.
qualificatifs.Je ne sais pas si il y a effectivement un cas où cela est manifestement inférieure à ne nécessitant pas la fonction définitions contenues dans une classe.