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)
Réponses
Trop de publicités?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.
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.
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.