2010-04-16 19 views
7

Duplicar posibles:
Namespace only class visibility in C#/.NET ?clases particulares espacios de nombres dentro

Lo que yo quiero es tener una clase que sólo se puede acceder a otras clases dentro del mismo espacio de nombres sin tener que poner el espacio de nombres en su propio montaje.

¿Hay alguna razón por la que esto no sea posible en C#?

Editar: He cambiado la pregunta un poco, ya que el compilador me dice que private no está permitido. ¿Alguien puede decirme el motivo de esto?

+0

¿hay algo que no se haya preguntado? Me perdí esto cuando escribí la pregunta. ¿Pero alguna idea de por qué esto es así? – user318253

+0

jeje ... Me pregunto cómo las personas encuentran publicaciones duplicadas tan rápido, aunque ni siquiera está en la lista en la sección "Relacionados" a la derecha. @James: ¿Cómo haces eso? :) – gehho

+0

Tal vez si dices por qué tienes que hacer eso, ¿la gente puede ofrecerte alternativas? Tal como está, lo que quieres hacer es imposible de lograr. –

Respuesta

2

Además de la respuesta de gehho: el espacio de nombres es solo una parte del nombre del tipo (que solo permite que todos los tipos tengan nombres únicos). Es por eso que no puede restringir el acceso a tipos dentro de un espacio de nombres.

+0

¿Entonces los espacios de nombres están solo ahí para evitar conflictos y no tanto para agrupar de una manera que hace una carpeta? Un espacio de nombres solo da contexto a los tipos que lo contienen, ¿es eso lo que dices? – user318253

+0

@blacklion: piense en un espacio de nombres como un identificador único para un tipo. Le permite tener 2 clases del mismo nombre, p. Ej. 'System.DateTime' es diferente de' MyNamespace.DateTime' – James

+0

Gracias, creo que estaba pensando en paquetes en Java – user318253

5

Esto no es posible.

Solo puede restringir el acceso al ensamblaje que contiene la clase utilizando el modificador internal.

También podría restringir el acceso a la clase a una sola clase haciendo que la clase sea una clase anidada. P.ej. Si hace que la clase B sea una clase privada anidada en la clase A, B solo será accesible por A.

Creo que estas dos opciones son lo mejor que puede hacer. Si realmente desea restringir el acceso al espacio de nombres, deberá colocarlo en un ensamblaje por separado.

EDIT: A su segunda pregunta: por qué una clase privada no está permitida. Las clases privadas solo están permitidas si están anidadas dentro de otra clase. Si convierte una clase no anidada en privada, ¿de qué sirve? No puedes acceder de todos modos, así que no puedes hacer nada con eso.

+0

¿Hay alguna razón por la que esto no sea posible en C#? ¿Por qué los creadores no permiten esto? – user318253

+0

es realmente difícil hacer preguntas aquí. Tengo que decirlo tan cuidadosamente. a su edición: por ejemplo, se permite privado para los tipos dentro de las clases y todo dentro de la clase tiene acceso a ellos. private no restringe TODO el acceso a un tipo – user318253

+0

No entiendo su comentario. ¿Es esta una pregunta? Si es así, reformúlelo o brinde más detalles. ¿O crees que mi respuesta es incorrecta? – gehho

2

Puede restringir la visibilidad al ensamblaje actual utilizando una clase internal.

Sin embargo, puede permitir que otro conjunto obtenga visibilidad de su conjunto mediante el atributo InternalsVisibleTo.

Ejemplo

Definir MyInternalClass en AssemblyOne montaje:

[assembly: InternalsVisibleTo("AssemblyTwo")] 

internal class MyClass { 
    internal void DoSomeAction() { } 
} 

a continuación, definir otra clase en AssemblyTwo:

public class MyOtherClass 
{ 
    public void DoAnotherAction() 
    { 
     MyClass c = new MyClass(); 
     c.DoSomeAction(); 
    } 
} 
+0

Gracias, esa no fue mi pregunta, aunque – user318253

+0

@blacklion: Sí, no restringe la visibilidad al espacio de nombres. No entiendo bien tu pregunta. –

0

Como puede agregar tipos de espacio de nombres en cualquier otro ensamblado externo . ¿Los tipos en el mismo espacio de nombres, pero un ensamblaje diferente verán sus "tipos privados"?

En caso negativo, tenemos un comportamiento difícil de entender (un tipo del espacio de nombres podría ver su tipo, otro - no). En caso afirmativo, tenemos una contradicción con la definición de "privado", porque los tipos en diferentes conjuntos tendrían acceso a detalles "privados" de ensamblaje.

+0

ver respuesta de Thibault Falise sobre InternalsVisibleTo – user318253

0

Puede declarar espacios de nombres arbitrarios, por lo que podría declarar sus propias clases como parte del espacio de nombres del sistema, por ejemplo. Por supuesto, eso dará como resultado un error si Microsoft decide agregar una clase con el mismo nombre a su espacio de nombres.

¿Por qué quieres tener "namespace-visibility"? Significaría un tipo especial de público, ya que cualquiera podría declarar que su clase está en el espacio de nombres requerido y, por lo tanto, acceder a sus clases.

Si lo quiere como característica de seguridad, esto no funcionará. Si desea limpiar su espacio de nombres ocultando las clases "internas", podría tener un espacio de nombres Internals debajo de su espacio de nombres principal, por ejemplo.

Cuestiones relacionadas