Pregunta

Considerando " privado " es el modificador de acceso predeterminado para los miembros de la clase, ¿por qué es incluso necesaria la palabra clave?

¿Fue útil?

Solución

Es para usted (y futuros mantenedores), no para el compilador.

Otros consejos

Aquí hay una cierta cantidad de información errónea:

  

" El modificador de acceso predeterminado no es privado sino interno "

Bueno, eso depende de lo que estés hablando. Para los miembros de un tipo, es privado. Para los tipos de nivel superior en sí, es interno.

  

" Privado es solo el valor predeterminado para métodos en un tipo "

No, es el valor predeterminado para todos los miembros de un tipo: propiedades, eventos, campos, operadores, constructores, métodos, tipos anidados y cualquier otra cosa que haya olvidado.

  

" En realidad, si la clase o estructura no se declara con un modificador de acceso, el valor predeterminado es interno "

Solo para tipos de nivel superior. Para los tipos anidados, es privado.

Además de restringir el acceso a la propiedad para una parte pero no para la otra, el valor predeterminado es básicamente siempre " tan restrictivo como puede ser. "

Personalmente, me cuestiono en cuanto a si ser explícito. El " pro " para usar el valor predeterminado es que resalta en cualquier lugar que está haciendo algo más visible que el nivel más restrictivo. El " pro " para especificarlo explícitamente es que es más obvio para aquellos que no conocen la regla anterior y muestra que lo has pensado un poco.

Eric Lippert va con la forma explícita, y yo también estoy empezando a inclinarme de esa manera.

Consulte http://csharpindepth.com/ViewNote.aspx?NoteID=54 por un poco más sobre esto.

Explicitness. Nunca uso el valor predeterminado y siempre agrego explícitamente el modificador.

Esto podría deberse a mi fondo de Java, donde el valor predeterminado era "paquete" (aproximadamente equivalente a "interno" en C #), por lo que la diferencia siempre me molestó. Me pareció preferible ser explícito.

También uso ReSharper ahora, que de forma predeterminada es explícito, por lo que solo confirma y refuerza mi sesgo :)

El modificador privado explica la intención.

Una variable miembro privada no está diseñada para la manipulación directa fuera de la clase. get / set accessors pueden o no crearse para la variable.

Un método privado no está diseñado para ser usado fuera de la clase. Esto puede ser sólo para la funcionalidad interna. O podría hacer que un constructor predeterminado sea privado para evitar la construcción de la clase sin pasar valores.

El modificador privado (y otros similares) puede ser una forma útil de escribir código de auto-documentación.

Como lo señaló Jon Skeet en su libro C # en profundidad , hay un lugar en C # donde se requiere la palabra clave privada para lograr un efecto.

Si mi memoria funciona correctamente, la palabra clave privada es la única forma de crear un captador o definidor de propiedades de ámbito privado, cuando su opuesto es mayor que la accesibilidad privada. Ejemplo:

public bool CanAccessTheMissileCodes
{
    get { return canAccessTheMissileCodes; }
    private set { canAccessTheMissileCodes = value; }
}

La palabra clave privada es requerida para lograr esto, porque un modificador de accesibilidad de propiedad adicional solo puede limitar el alcance, no ampliarlo. (De lo contrario, uno podría haber podido crear una propiedad privada (por defecto) y luego agregar un modificador público).

Privado es solo el valor predeterminado para métodos en un tipo, pero el modificador privado se usa en otros lugares.

De C # Language Specification 3.0 (msdn) Sección 3.5. 1

  

Según el contexto en el que se realice la declaración de un miembro, solo se permiten ciertos tipos de accesibilidad declarada. Además, cuando una declaración de miembro no incluye ningún modificador de acceso, el contexto en el que se lleva a cabo la declaración determina la accesibilidad declarada predeterminada.

     
      
  • Los espacios de nombres tienen acceso público declarado implícitamente. No se permiten modificadores de acceso en las declaraciones de espacio de nombres.
  •   
  • Los tipos declarados en unidades de compilación o espacios de nombres pueden tener accesos y valores predeterminados públicos o internos.   a la accesibilidad declarada interna.
  •   
  • Los miembros de la clase pueden tener cualquiera de los cinco tipos de accesibilidad declarada y por defecto a la accesibilidad declarada privada. (Tenga en cuenta que un tipo declarado como miembro de una clase puede tener cualquiera de los cinco tipos de accesibilidad declarada, mientras que un tipo declarado como miembro de un espacio de nombres solo puede tener accesibilidad declarada pública o interna).
  •   
  • Los miembros de Struct pueden tener accesibilidad pública, interna o privada declarada y por defecto a la accesibilidad declarada privada porque las estructuras están implícitamente selladas. Los miembros de Struct introducidos en una estructura (es decir, no heredados por esa estructura) no pueden tener una accesibilidad declarada interna protegida o protegida. (Tenga en cuenta que un tipo declarado como miembro de una estructura puede tener accesibilidad declarada pública, interna o privada, mientras que un tipo declarado como miembro de un espacio de nombres solo puede tener accesibilidad declarada pública o interna).
  •   
  • Los miembros de la interfaz tienen implícitamente acceso público declarado. No se permiten modificadores de acceso en las declaraciones de miembros de la interfaz.
  •   
  • Los miembros de la enumeración tienen acceso público declarado implícitamente. No se permiten modificadores de acceso en las declaraciones de miembros de enumeración.
  •   

Para completar. Y algunas personas realmente prefieren ser explícitas en su código sobre los modificadores de acceso en sus métodos.

Para la simetría y para ajustarse a los estilos de codificación que les gusta que todo sea explícito (personalmente me gusta ...)

El uso privado señala explícitamente tu intención y deja pistas para otros que apoyarán tu código;)

Algunos estilos de codificación recomiendan que coloques todos los " públicos " primero los elementos, seguidos de " privado " artículos. Sin un " privado " palabra clave, no podría hacerlo de esa manera.

Actualización: no me di cuenta de que " c # " etiqueta en esto para que mi respuesta se aplique más a C ++ que a C #.

Por lo general, dejo la privacidad, pero me parece útil para alinear el código:

private   int    x;
public    string y;
protected float  z;

VS:

int x;

public    string y;
protected float  z;

Como Robert Paulson dijo en su respuesta, el privado no solo se utiliza en miembros, sino también en tipos . Esto se vuelve importante porque el valor predeterminado para los tipos es interno que puede filtrarse involuntariamente si usa InternalsVisibleToAttribute .

En realidad, si la clase o estructura no se declara con un modificador de acceso, el valor predeterminado es interno.

Entonces, si quieres que sea privado, usa privado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top