141 votes

Espace de nom et classe avec le même nom ?

Je suis en train d'organiser 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 diagramme de scène soit MyLib.Scenegraph et les autres classes à être MyLib.Scenegraph.* mais il semble que la seule façon de le faire serait de faire de toutes les autres classes des classes internes de Scenegraph dans le fichier Scenegraph.cs et c'est tout simplement trop lourd.

Au lieu de cela, je l'ai organisé comme suit Mylib.Scenegraph.Scenegraph y MyLib.Scenegraph.* Cela fonctionne en quelque sorte, mais je trouve que Visual Studio ne sait pas toujours si je fais référence à la classe ou à l'espace de nom.

Existe-t-il un bon moyen d'organiser ce paquet de manière à ce qu'il soit pratique pour les utilisateurs sans pour autant rassembler tout mon code dans un fouillis impossible à maintenir ?

9voto

Paul Sumpner Points 81

Ça arrive quand c'est la classe principale de l'espace de nom. C'est donc une motivation pour mettre l'espace de noms dans une bibliothèque, mais le problème disparaît si vous ajoutez "Lib" au nom de l'espace de noms...

namespace SocketLib
{
    class Socket
    {

7voto

m-y Points 12871

CA1724: Type Names Should Not Match Namespaces ...

Fondamentalement, si vous suivez l'analyse de code pour un codage correct, cette règle vous dit de ne pas faire ce que vous essayez de faire. L'analyse du code est très utile pour vous aider à trouver potentiel problèmes.

6voto

Marcelo Myara Points 447

Vieux poste, mais voici une autre idée qui pourrait aider quelqu'un :

"...mais il semble que la seule façon de le faire serait de faire de toutes les autres classes des classes internes de Scenegraph dans le fichier Scenegraph.cs et c'est tout simplement trop lourd."

C'est vraiment la meilleure mise en œuvre pour un grand nombre de scénarios. Mais, je suis d'accord pour dire que le fait d'avoir tout ce code dans le même fichier .cs est ennuyeux (c'est le moins qu'on puisse dire).

Vous pouvez résoudre ce problème en faisant de la classe de base une "classe partielle", puis en créant les classes internes dans leurs propres fichiers (n'oubliez pas qu'ils devront déclarer le complément de la classe de base, puis créer la classe interne spécifique à ce fichier).

Quelque chose comme...

Scenegraph.cs :

namespace MyLib
{
    public partial class Scenegraph
    {
        //Scenegraph specific implementations
    }
}

DependentClass.cs :

namespace MyLib
{
    public partial class Scenegraph
    {
        public class DependentClass
        {
            //DependentClass specific implementations
        }
    }
}

Je pense que c'est le meilleur moyen d'avoir une implémentation propre des classes internes sans avoir à tout encombrer dans un fichier énorme et désordonné.

4voto

Steve Points 583

J'ajoute juste mes 2 cents :

J'ai eu la classe suivante :

namespace Foo {
    public struct Bar {
    }
    public class Foo {
        //no method or member named "Bar"
    }
}

Le client était écrit comme ceci :

using Foo;

public class Blah {
    public void GetFoo( out Foo.Bar[] barArray ) {
    }
}

En pardonnant l'erreur GetFoo qui ne retourne pas la sortie au lieu d'utiliser le paramètre out, le compilateur ne pouvait pas résoudre le type de données Foo.Bar[] . Il renvoyait l'erreur : could not find type or namespace Foo.Bar .

Il semble que lorsqu'il tente de compiler, il résolve Foo comme classe et ne trouve pas de classe intégrée Bar dans la classe Foo. Il n'a pas non plus trouvé d'espace de nom appelé Foo.Bar . Il n'a pas cherché de classe Bar dans l'espace de nom Foo. Les points dans un espace de noms 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é constaté par VS 2015 sous .Net 4.6.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X