usa una tipo que programacion pero orientada objetos nombres miembros metodos metodo instanciar espacio ejemplos como clases clase c# language-features

c# - una - que es un metodo en programacion



¿Se pueden crear clases privadas en C#? (6)

Esta es una pregunta para los filósofos .NET:

Tengo entendido que Microsoft negó conscientemente el uso de clases privadas en C #. ¿Por qué hicieron esto y cuáles son sus argumentos para hacerlo?

Yo, por ejemplo, estoy creando una gran aplicación que incluye una herramienta de informes. Esta herramienta utiliza una gran cantidad de objetos de negocios que se usan solo dentro de la herramienta de informes y no en otras partes del proyecto. Quiero encapsularlos para su uso solo dentro de la propia herramienta de informes.

La gran decisión es crear un proyecto separado en VS para esta herramienta, y lo haré así, pero soy interesante, y si no puedo hacer esto, por ejemplo, nuestra arquitectura no fue lo suficientemente buena, y tenemos un gran single proyecto.

Detrás de "clase privada" me refiero a una clase que no se puede usar en ningún otro espacio de nombres, excepto el suyo propio.

Mi pregunta no fue: ¿cómo puedo simular esto o hacerlo de otra manera? Me pregunto, ¿por qué no usar una palabra clave privada con una palabra clave de clase sin ninguna clase principal? Estoy pensando que debería haber alguna razón, y quiero saberlo.


Así que supongo que quieres hacer esto

namespace Baz { private class foo { private int _bar; } }

En caso afirmativo. Entonces, ¿cuál es el propósito del servidor foo? En namespace, puede ser más restrictivo que interno, y hacer cualquier uso de la clase. Si pudiera hacer esto, ¿dónde usaré esto?

Es por eso que tienes esta validación en tiempo de compilación.

Ahora dentro de una clase pública tiene sentido tener una clase privada. No puedo explicarlo mejor en estas clases internas privadas en C #: ¿por qué no se usan con más frecuencia? .


Es cierto, pero puede obtener una simulación bastante cercana de esto con las clases internas y el internalsvisibletoAttribute del atributo si el espacio de nombres se divide en varios ensamblajes.

También recuerde que una clase dentro de otra puede ser privada para la clase externa. La clase externa puede considerarse un espacio de nombres para este propósito.


Hay una solución para esto, pero puede que no te guste.

En lugar de usar un namespace de namespace para cubrir sus clases, use una public static partial class :

Antes de:

namespace MyCompany.Foo { class Bar { } public class Baz { } }

Después:

namespace MyCompany { public static partial class Foo { private class Bar { } public class Baz { } } }

Esta construcción, como un espacio de nombres, puede abarcar varios archivos en el mismo proyecto. Pero a diferencia de un espacio de nombres, no puede "escapar" de su proyecto (otros proyectos no pueden definir otros miembros dentro de Foo ).

Existe una ventaja adicional de que puede tener métodos de utilidad que parecen no tener clase para el código dentro de Foo .

La desventaja es que, para usar sus clases no privadas fuera de su espacio de nombres falso, debe hacer referencia a ellas dentro de Foo :

using MyCompany; // ... var baz = new Foo.Baz();

Esto se puede mitigar utilizando un alias para la clase:

using Baz = MyCompany.Foo.Baz; // ... var baz = new Baz();

Pero tendrías que hacerlo para cada clase no privada que quieras usar.

ACTUALIZAR

Es interesante notar que C # 6 tendrá declaraciones de uso estático , lo que podría mejorar esta propuesta para usar una public static partial class como un "módulo". Simplemente "utilizaría" el "módulo" para acceder a sus tipos directamente.

Con suerte, funcionará así:

using MyCompany.Foo; // ... var baz = new Baz();

Como si Foo fuera un espacio de nombres.


Permitir que las clases sean privadas a un espacio de nombres no lograría ningún nivel de protección significativo.

Cualquier ensamblaje en el mundo podría simplemente hacer referencia a su dll y comenzar a escribir código en su espacio de nombres que acceda a sus clases supuestamente privadas.

Creo que esa es posiblemente la respuesta que obtendría de Microsoft.


Puede definir una clase privada, pero solo puede ser utilizada por su clase contenedora.

Si desea una clase que solo sea visible dentro de un conjunto particular (DLL / EXE / etc.), Entonces debe declararlo como internal ( Friend in VB)


Puedes crear una clase privada, como miembro de otro tipo:

public class Outer { // ... private class Inner { // ... } }

e Inner solo es visible para miembros de Outer .

En el nivel más externo (es decir, en un espacio de nombres), el private según su definición no tendría sentido (ya que no hay nada en lo que estar privado). En su lugar, utilice internal (visible solo para los miembros del ensamblaje que contiene)