102 votes

Visibilité de classe d'espace de noms uniquement en C # / .NET?

En C #, pouvez-vous rendre une classe visible uniquement dans son propre espace de noms sans vivre dans un assemblage différent? Cela semble utile pour les classes d’aide typiques qui ne devraient pas être utilisées ailleurs. (c.-à-d. ce que java appelle le paquet classes privées)

87voto

Robert Cartaino Points 12173

Vous pouvez rendre les classes internal , mais cela n'empêche quiconque à l'extérieur de l' assemblée de l'utilisation de la classe. Mais vous avez encore à faire une assemblée distincte pour chaque espace de noms que vous voulez faire avec. Je suppose que c'est pourquoi vous n'auriez pas envie de le faire.

Obtenir le Compilateur C# pour faire Respecter l'espace de Noms de la Visibilité

Il y a un article ici (espace de Noms de la visibilité en C#) qui montre une méthode d'utilisation des classes partielles comme une forme de "faux noms" de ce que vous pourriez trouver utiles.

L'auteur souligne que cela ne fonctionne pas parfaitement et il discute des lacunes. Le principal problème est que C# concepteurs conçu le C# ne pas travailler de cette façon. Ce dernier s'écarte fortement de pratiques de codage en C#/.NET, qui est l'un de la .NET Cadres de plus grands avantages.

C'est un truc intéressant... maintenant, ne pas le faire.

40voto

Steven Sudit Points 13793

Je ne pense pas que ce que tu veux soit possible.

23voto

ShuggyCoUk Points 24204

interne est l'assemblée (strictement parlant module) de la vie privée. Il n'a pas d'effet sur l'espace de noms de la visibilité.

La seule façon de parvenir à la vie privée d'une classe à partir d'autres classes au sein de la même assemblée est d'une classe à l'intérieur de la classe.

À ce stade, si la classe est privée, elle est invisible à ce qui n'est pas dans la classe ou à l'extérieur de la classe elle-même.

S'il est protégé, il est visible à tout le monde qui pourrait la voir en privé, mais aussi à des sous-classes de l'extérieur de la classe.

public class Outer
{
    private class Hidden     { public Hidden() {} }
    protected class Shady    { public Shady() {} }
    public class Promiscuous { public Promiscuous() {} }
}

public class Sub : Outer
{
    public Sub():base() 
    {
        var h = new Hidden();      // illegal, will not compile
        var s = new Shady();       // legal
        var p = new Promiscuous(); // legal
    }
}

public class Outsider 
{
    public Outsider() 
    {
        var h = new Outer.Hidden();      // illegal, will not compile
        var s = new Outer.Shady()        // illegal, will not compile
        var p = new Outer.Promiscuous(); // legal
    }
}

En essence, la seule façon d'obtenir ce que vous désirez est d'utiliser l'extérieur de la classe comme une forme d'espace de noms et de restreindre l'intérieur de cette classe.

0voto

Nathan Points 382

Si vous avez un seul assemblage, vous pouvez définir autant d'espaces de noms que vous le souhaitez, mais quel que soit le modificateur que vous appliquez dans l'EDI, vous pourrez toujours voir les classes dans d'autres espaces de noms.

0voto

Wyatt Barnett Points 12541

Je ne sais pas si c'est directement possible, mais voici quelques bonnes façons de le simuler:

1) Les classes qui ont besoin de ce type de choses héritent d’une classe unique qui a la classe auxiliaire comme classe interne.

2) Utilisez des méthodes d'extension et ne faites ensuite référence qu'aux méthodes d'extension dans l'espace de noms.

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