2008-09-26 17 views
22

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

+12

¡Presentado por el Departamento de Redundancia de la Redundancia! –

+0

@Kiwi: sobre su edición, también es el predeterminado para las clases, no solo para los miembros de la clase, ¿no? –

+0

@Brad: excelente hombre de humor. –

Respuesta

28

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

15

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' (más o menos equivalente a 'interno' en C#) y la diferencia siempre me molestó. Encontré explícito ser preferible.

también uso ReSharper ahora que de forma predeterminada a ser explícito, por lo que sólo confirma y refuerza mi sesgo :)

2

Por simetría y con arreglo a la codificación de los estilos que les gusta que todo sea explícita (personalmente me gusta .. .)

1

Algunos estilos de codificación recomiendan que ponga primero todos los elementos "públicos", seguidos de los ítems "privados". Sin una palabra clave "privada", no podría hacerlo de esa manera.

Actualización: No noté la etiqueta "C#" en esto así que mi respuesta se aplica más a C++ que a C#.

+0

Um, la visibilidad no es modal en C# como en C++. La palabra clave privada es necesaria para los momentos en que no es la predeterminada (y existen momentos tales como las declaraciones de clase), pero poner "privado" frente a un método es de hecho redundante e innecesario. –

+0

Eso es cierto, pero la pregunta en realidad no mencionaba C#. –

+0

Importante para leer las etiquetas. :) –

3

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

-1

En realidad, si la clase o estructura no está declarada con un modificador de acceso, por defecto es interna.

Así que si quieres que sea privado, usa privado.

+0

si un tipo no está anidado, los valores predeterminados son los tipos internos y no anidados que no pueden declararse privados (¿a qué serían privados más allá de la visibilidad interna?) –

9

El modificador privado explica la intención.

Una variable miembro privada no está destinada a la manipulación directa fuera de la clase. los accesadores get/set pueden o no crearse para la variable.

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

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

1

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

5

privada no es más que el valor predeterminado para métodos en un tipo, pero el modificador privada se utiliza en otros lugares.

De C# Language Specification 3.0 (msdn) Sección 3.5.1

Dependiendo del contexto en el que una declaración de miembro tiene lugar, sólo se permiten determinados tipos de accesibilidad declarada. Además, cuando una declaración miembro no incluye ningún modificador de acceso, el contexto en el que tiene lugar la declaración determina la accesibilidad declarada predeterminada.

  • Los espacios de nombres tienen implícitamente acceso público declarado. No se permiten modificadores de acceso en las declaraciones de espacios de nombres.
  • Los tipos declarados en unidades de compilación o espacios de nombres pueden tener acceso público o declarado y predeterminado a la accesibilidad interna declarada.
  • Los miembros de la clase pueden tener cualquiera de los cinco tipos de accesibilidad declarada y el acceso privado predeterminado declarado. (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 nombre solo puede tener accesibilidad declarada pública o interna).
  • Los miembros de Struct pueden tener la accesibilidad declarada pública, interna o privada y la accesibilidad declarada de forma predeterminada 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 protegida o protegida la accesibilidad declarada interna. (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 pública o interna declarada)
  • Los miembros de la interfaz tienen implícitamente acceso público declarado No se permiten modificadores de acceso en las declaraciones de los miembros de la interfaz.
  • Los miembros de enumeración tienen implícitamente acceso público declarado. No se permiten modificadores de acceso en las declaraciones de miembros de enumeración.
1

me suelo dejar privado a cabo pero me resulta útil para alinear código:

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

VS:

int x; 

public string y; 
protected float z; 
7

Como señala 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 manera de crear un getter o setter de propiedad de ámbito privado, cuando su opuesto tiene una accesibilidad mayor que la privada. Ejemplo:

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

La palabra clave privada es necesaria para lograr esto, porque un modificador adicional accesibilidad propiedad sólo puede reducir el alcance, no ensancharlo. (De lo contrario, uno podría haber sido capaz de crear una empresa privada (por defecto) propiedad y luego añadir un modificador público.)

+0

+1: esta es una pregunta interesante sobre la pregunta. –

1

Como Robert Paulson dijo en su respuesta, el modificador private no sólo se utiliza en los miembros, sino también en tipos. Esto se vuelve importante porque el valor predeterminado para los tipos es internal, que puede filtrarse involuntariamente si usa InternalsVisibleToAttribute.

64

Hay una cierta cantidad de información errónea aquí:

"El modificador de acceso por defecto no es privada sino interno"

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

"privada sólo es el valor predeterminado para métodos en un tipo de"

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 he olvidado.

"En realidad, si la clase o estructura no se declara con un modificador de acceso por defecto a" interno

Sólo para los tipos de alto nivel. Para tipos anidados, es privado.

Aparte 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 sea posible".

Personalmente, dudo sobre la cuestión de si ser explícito. El "profesional" para usar el valor por defecto es que resalta en cualquier lugar que está haciendo algo más visible que el nivel más restrictivo. El "profesional" 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 estoy comenzando a inclinarme de esa manera también.

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

+0

¿No era el modificador predeterminado para _struct_ members "public" en alguna versión de .NET? ¿O estoy confundido con algo más? – Konamiman

+0

@Konamiman: No es que alguna vez lo recuerde. ¿Tal vez en un prelanzamiento? –

+0

Mi primer contacto con .NET fue en 2003, v1.1. Tal vez leí alguna documentación previa a la publicación inadvertidamente. – Konamiman

Cuestiones relacionadas