47 votes

Classe déclarée à l'intérieur d'une autre classe en C#

Je suis en train de travailler sur un code existant et à venir à travers quelque chose que je ne suis pas sûr de. Nous avons un class y qui est déclarée à l'intérieur d'un autre class x. Class y n'est jamais utilisé à l'intérieur de l' class x mais ma question est pourquoi ne pas vous créer un fichier de classe et de mettre class y y au lieu de le déclarer à l'intérieur de l' class x? N'est-ce pas violer la programmation orientée objet ou est-ce simplement une question de style, car il n'est jamais utilisé à l'intérieur de cette classe. Je suis refactoring partie de ce code et ma première réaction serait de séparer class y dans son propre fichier.

namespace Library
{
   public class x
   {
      // methods, properties, local members of class x

      class y
      {
         // methods, properties, local members of class y
      }
   }
}

60voto

plinth Points 26817

Vous créer un intérieur de classe, car il n'est jamais utilisé dans le cadre de la classe x et logiquement, il s'inscrit dans l'affacturage/architecture de la classe x.

Classe y pourrait également être au courant des détails de l'implémentation de la classe x qui ne sont pas destinés à être connu du public.

20voto

Marc Gravell Points 482669

Cela a des autorisations d'implications. Un haut-niveau de la classe "y" serait "interne" - cependant, ici, "y" est privé de "x". Cette approche est utile pour les détails de mise en œuvre (par exemple cache rangs, etc). De même, y a accès à tous les particuliers de l'état de l' x.

Il y a aussi des implications avec les génériques; x<T>.y est générique "T", hérité de l'extérieur de la classe. Vous pouvez le voir ici, où Bar a la pleine utilisation de T - et notez que les champs statiques de Bar sont limités par-T.

class Foo<T> {
    void Test(T value) {
        Bar bar = new Bar();
        bar.Value = value;
    }
    class Bar {
        public T Value { get; set; }
    }
}

Souvent, les gens incorrectement pense que ils ont besoin pour définir Bar comme Bar<T> - c'est maintenant (efficacement) doublement générique - c'est-àdire Foo<TOld, T> - où TOld est (maintenant disponible) T de Foo<T>. Donc ne faites pas ça! Ou si vous voulez qu'il soit doublement générique, choisir des noms différents. Heureusement, le compilateur vous avertit à ce sujet...

7voto

Pawel Krakowiak Points 3494

Ce code est très bien pour la raison exacte que vous avez donné - "classe y est jamais utilisé à l'intérieur de la classe x". Ceux-ci sont les types imbriqués et une des lignes directrices pour l'utilisation, est que les types imbriqués devraient être étroitement associés à leur déclarant type et ne doit pas être utile comme un usage général type. De cette façon, la classe imbriquée est inaccessible aux autres classes, mais vous permet toujours de suivre orientée objet principes.

2voto

phatoni Points 166

Je pense que c'est ok, tant que le contenu de classe est uniquement utilisé comme utilitaire. J'utilise cette sorte de construire par exemple, pour définir complexes types de retour pour les méthodes privées.

2voto

Dan McClain Points 7036

Je suis juste allé à travers le code que je mets à jour (et j'ai d'abord écrit) et supprimé toutes les classes imbriquées. Malheureusement, j'ai d'abord utilisé la classe imbriquée à l'extérieur de la classe qu'il a été défini. Déplacement de classes imbriquées a une énorme différence pour moi parce que j'ai d'abord eu une mauvaise conception.

Si Y n'est utilisé que dans X et ne sera jamais utilisé en dehors de X, je dirais que l'y maintenir

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