En C #, ¿puede hacer que una clase sea visible solo dentro de su propio espacio de nombres sin vivir en un ensamblado diferente? Esto parece útil para las clases auxiliares típicas que no deberían usarse en otros lugares. (es decir, lo que Java llama clases privadas de paquetes)
87
Respuestas:
No creo que lo que quieres sea posible.
fuente
Puede crear las clases,
internal
pero esto solo evita que cualquier persona ajena al ensamblado use la clase. Pero aún tiene que hacer un ensamblado separado para cada espacio de nombres con el que desea hacer esto. Supongo que es por eso que no querrías hacerlo.Conseguir que el compilador de C # aplique la visibilidad del espacio de nombres
Hay un artículo aquí ( Visibilidad del espacio de nombres en C # ) que muestra un método para usar clases parciales como una forma de "espacio de nombres falso" que puede resultarle útil.
El autor señala que esto no funciona a la perfección y analiza las deficiencias. El principal problema es que los diseñadores de C # diseñaron C # para que no funcione de esta manera. Esto se desvía mucho de las prácticas de codificación esperadas en C # / .NET, que es una de las mayores ventajas de .NET Frameworks.
Es un buen truco ... ahora no lo hagas.
fuente
System.Net.Mime.MediaTypeNames.Application
interno es la privacidad del ensamblaje (módulo estrictamente hablando). No tiene ningún efecto sobre la visibilidad del espacio de nombres.
La única forma de lograr la privacidad de una clase de otras clases dentro del mismo ensamblado es que una clase sea una clase interna.
En este punto, si la clase es privada, es invisible para cualquier cosa que no esté en esa clase o en la propia clase externa.
Si está protegido, es visible para todos los que podrían verlo cuando es privado, pero también es visible para las subclases de la clase externa.
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 esencia, la única forma de lograr lo que desea es utilizar la clase externa como una forma de espacio de nombres y restringir dentro de esa clase.
fuente
Si tiene un solo ensamblado, puede definir tantos espacios de nombres en ese ensamblado como desee, pero no importa qué modificador aplique en el IDE, siempre podrá ver las clases en otros espacios de nombres.
fuente
No estoy seguro de si es directamente posible, pero algunas buenas formas de falsificarlo serían:
1) Haga que las clases que necesitan este tipo de cosas hereden de una sola clase que tiene la clase auxiliar como clase interna.
2) Utilice métodos de extensión y luego solo haga referencia a los métodos de extensión dentro del espacio de nombres.
fuente