J'organise un projet de bibliothèque et j'ai une classe de gestionnaire central nommée Scenegraph
et tout un tas d'autres classes qui vivent dans l'espace de noms Scenegraph.
Ce que j'aimerais vraiment, c'est que le scénegraph soit MyLib.Scenegraph
et que les autres classes soient MyLib.Scenegraph.*
, mais il semble que la seule façon de le faire serait de créer toutes les autres classes des classes internes du Scenegraph
fichier Scenegraph.cs et c'est tout simplement trop lourd .
Au lieu de cela, je l'ai organisé en tant que Mylib.Scenegraph.Scenegraph
et MyLib.Scenegraph.*
, ce qui fonctionne, mais je trouve que Visual Studio est confus dans certaines conditions quant à savoir si je fais référence à la classe ou à l'espace de noms.
Existe-t-il un bon moyen d'organiser ce package pour qu'il soit pratique pour les utilisateurs sans gâcher tout mon code dans un désordre impossible à maintenir?
la source
using Foo.Bar;
alors plus tardBar b
fait clairement référence àBar
une classe (ou une énumération) à l'intérieur de l'espace de nomsFoo.Bar
. La vraie raison de ne pas faire cela est purement que le compilateur C # ne le comprend pas correctement, ce qui est terriblement surprenant et malheureux. Tout le reste est un conseil de style laineux.Donner le même nom à l'espace de noms et à la classe peut dérouter le compilateur comme d'autres l'ont dit.
Comment le nommer alors?
Si l'espace de noms a plusieurs classes, recherchez un nom qui définit toutes ces classes.
Si l' espace de noms n'a qu'une seule classe (et donc la tentation de lui donner le même nom), nommez l'espace de noms ClassName NS . C'est ainsi que Microsoft nomme au moins leurs espaces de noms.
la source
Je vous suggère de suivre les conseils que j'ai reçus
microsoft.public.dotnet.languages.csharp
pour utiliserMyLib.ScenegraphUtil.Scenegraph
etMyLib.ScenegraphUtil.*
.la source
CA1724: Type Names Should Not Match Namespaces
...Fondamentalement, si vous suivez l'analyse du code pour un codage approprié, cette règle dit de ne pas faire ce que vous essayez de faire. L'analyse de code est très utile pour vous aider à trouver des problèmes potentiels .
la source
Juste ajouter mes 2 cents:
J'ai eu le cours suivant:
Le client a été écrit comme ceci:
Oubliant l'erreur GetFoo de ne pas renvoyer la sortie au lieu d'utiliser le paramètre out, le compilateur n'a pas pu résoudre le type de données Foo.Bar []. Il renvoyait l'erreur: impossible de trouver le type ou l'espace de noms Foo.Bar.
Il semble que lorsqu'il essaie de compiler, il a résolu Foo en tant que classe et n'a pas trouvé de classe intégrée Bar dans la classe Foo. Il n'a pas non plus pu trouver un espace de noms appelé Foo.Bar. Il n'a pas réussi à rechercher une classe Bar dans l'espace de noms Foo. Les points dans un espace de nom ne sont PAS syntaxiques. La chaîne entière est un jeton, pas les mots délimités par les points.
Ce comportement a été présenté par VS 2015 exécutant .Net 4.6
la source
Même si je suis d'accord avec d'autres réponses, vous ne devez pas nommer votre classe de la même manière que votre espace de noms il y a des moments où vous ne pouvez pas vous conformer à ces exigences.
Dans mon cas, par exemple, je n'étais pas la personne qui prenait une telle décision, donc je devais trouver un moyen de la faire fonctionner.
Donc, pour ceux qui ne peuvent pas changer le nom de l'espace de noms ni le nom de la classe, voici un moyen de faire fonctionner votre code.
Fondamentalement, j'ai créé des "alias" d'espace de noms et cela m'a permis de qualifier complètement la classe et la "confusion" de Visual Studio a disparu.
REMARQUE: vous devez éviter ce conflit de dénomination s'il est sous votre contrôle pour ce faire. Vous ne devez utiliser la technique mentionnée que lorsque vous ne contrôlez pas les classes et les espaces de noms en question.
la source
Ancien message, mais ici je vais avec une autre idée qui peut aider quelqu'un:
"... mais il semble que le seul moyen de le faire serait de créer toutes les autres classes des classes internes de Scenegraph dans le fichier Scenegraph.cs et c'est trop compliqué."
C'est vraiment la meilleure implémentation pour un tas de scénarios. Mais je suis d'accord pour dire qu'avoir tout ce code sur le même fichier .cs est ennuyeux (c'est le moins qu'on puisse dire).
Vous pouvez le résoudre en faisant de la classe de base une "classe partielle" et ensuite, continuer à créer les classes internes sur leurs propres fichiers (rappelez-vous simplement qu'ils devront déclarer le complément de classe de base, puis continuer avec la classe interne spécifique pour ce fichier).
Quelque chose comme...
Scenegraph.cs:
DependentClass.cs:
Je pense que c'est le plus proche que vous pouvez obtenir de l'implémentation propre des classes internes sans avoir à tout encombrer dans un fichier énorme et désordonné.
la source
Comme d'autres l'ont dit, c'est une bonne pratique d'éviter de nommer une classe de la même manière que son espace de noms.
Voici quelques suggestions de dénomination supplémentaires à partir d' une réponse de svick à une question connexe «Même nom de classe et d'espace de noms» sur la plateforme Software Engineering Stack Exchange:
(Notez que les utilisations de réponse ci - dessus
Model.DataSource.DataSource
,Model.QueryStorage.QueryStorage.
etModel.Project.Project
comme exemples plutôt queMyLib.Scenegraph.Scenegraph
.)(J'ai également trouvé les autres suggestions de noms dans les autres réponses ici utiles.)
la source
Cela se produit quand c'est la classe principale de l'espace de noms. C'est donc une motivation pour mettre l'espace de noms dans une bibliothèque, puis le problème disparaît si vous ajoutez 'Lib' au nom de l'espace de noms ...
la source