¿Alguna razón para escribir la palabra clave "privado" en C #?

109

Por lo que yo sé, privatees el valor por defecto en todas partes en C # (lo que significa que si no lo hago escritura public, protected, internal, etc, será privatepor defecto). (Por favor, corríjame si estoy equivocado.)

Entonces, ¿cuál es la razón para escribir esa palabra clave, o por qué existe incluso para los miembros?

Por ejemplo, cuando un controlador de eventos se genera automáticamente, se ve así:

private void RatTrap_MouseEnter(object sender, CheeseEventArgs e)
{

}

Pero, ¿por qué escribe privado si eso está implícito y predeterminado? ¿Solo para que los desarrolladores novatos (que no saben que es el valor predeterminado de C #) sepan que es privado? ¿O hay alguna diferencia para el compilador?

Por otra parte, hay un caso en el que la escritura "privado" (solo) se cambiará la accesibilidad del usuario?

Camilo Martín
fuente
18
IIRC, internalsin embargo , un tipo de "nivel superior" será el predeterminado.
Jeff Mercado
4
El valor predeterminado para todo no es privado, como se indica, y como regla general, es mejor ser explícito.
James Michael Hare
El valor predeterminado para todo es "lo más privado posible". Obviamente, una clase no anidada no puede ser privada, o nada podría instanciarla o usarla. Pero los miembros son privados de forma predeterminada y las clases anidadas son privadas de forma predeterminada. Todo en C # tiene, de forma predeterminada, el nivel de visibilidad más restringido que puede tener.
Ryan Lundy

Respuestas:

171

AFAIK, private es el valor predeterminado en todas partes de C # (lo que significa que si no escribo público, protegido, interno, etc., será privado de forma predeterminada). (corríjame si está mal).

Esto no es verdad. Los tipos definidos dentro de un espacio de nombres (clases, estructuras, interfaces, etc.) serán internos de forma predeterminada. Además, los miembros de diferentes tipos tienen diferentes accesibilidades predeterminadas (como público para los miembros de la interfaz). Para obtener más información, consulte Niveles de accesibilidad en MSDN.

También,

Entonces, ¿cuál es la razón para escribir esa palabra clave, o por qué existe?

Especificar esto explícitamente ayuda a denotar su intención de hacer que el tipo sea privado, de manera muy explícita. Esto ayuda a mantener el código con el tiempo. Esto puede ayudar a otros desarrolladores (o usted mismo) a saber si un miembro es privado de forma predeterminada o intencional, etc.

Reed Copsey
fuente
1
@Wayne: tiene una respuesta con una puntuación más alta que Jon Skeet pero no se la merece ... La respuesta de Jon es mucho más precisa.
aleroot
2
Ésta es una distinción sin sentido. Los tipos dentro de un espacio de nombres son internos de forma predeterminada porque no pueden ser privados de forma predeterminada; de lo contrario, nada podría usarlos. Siguen estando tan restringidos como sea posible, de forma predeterminada.
Ryan Lundy
1
La accesibilidad predeterminada de los miembros para las clases y estructuras inisde es privada. Consulte aquí: msdn.microsoft.com/en-us/library/ba0a1yw2(v=vs.90).aspx
Mitja Bonca
Pero los elementos dentro de un espacio de nombres no pueden serlo private.
Shimmy Weitzhandler
Además, gety de setforma predeterminada a la accesibilidad de la propiedad en sí
AustinWBryan
119

AFAIK, private es el valor predeterminado en todas partes en C #

No exactamente: el valor predeterminado es "el acceso más restringido disponible para esta declaración". Por ejemplo, con un tipo de nivel superior, el valor predeterminado es internal; para un tipo anidado, el valor predeterminado es private.

Entonces, ¿cuál es la razón para escribir esa palabra clave, o por qué existe?

Lo hace explícito, lo cual es bueno por dos razones:

  • Lo hace más claro para aquellos que no conocen los valores predeterminados, según su pregunta (nunca me gustó este argumento, personalmente, pero pensé que vale la pena mencionarlo)
  • Da la impresión de que ha decidido deliberadamente hacerlo privado, en lugar de simplemente ir con los valores predeterminados.

En cuanto a tu última parte:

Además, ¿hay algún caso en el que escribir "privado" (solo) cambiará la accesibilidad del miembro?

Sí, por hacer que la mitad de una propiedad sea más restrictiva que la otra:

// Public getter, public setter
public int Foo { get; set; }

// Public getter, private setter
public int Bar { get; private set; }

Yo solía ir con valores por defecto en todas partes que pude, pero me han convencido (en parte por Eric Lippert) que lo que es claro que ha pensado en ello y decidió hacer algo privado es una buena idea.

Personalmente, desearía que hubiera una forma de hacerlo para las declaraciones de tipo sellado / no sellado, posiblemente ni siquiera tener un valor predeterminado. Sospecho que muchos desarrolladores (incluido yo mismo si no tengo cuidado) dejan las clases sin sellar solo porque es menos esfuerzo que sellarlas.

Jon Skeet
fuente
+1. El uso de palabras clave irrelevantes para señalar la intención semántica es útil, aunque mi experiencia en Java hace el uso de finalun ejemplo más típico.
jprete
1
@minitech: Lo contrario también funciona, pero es menos útil. Todo esto se introdujo en C # 2.
Jon Skeet
20
Ciertamente desearía que no hubiera ningún valor predeterminado y que el compilador arrojara un error si faltaba el modificador de acceso. No creo que la mayoría de la gente sepa cuáles son los valores predeterminados para cada situación, lo que luego conduce a errores no deseados.
+1 "para un tipo anidado, el valor predeterminado es privado". Lo supe cuando leí tu respuesta. ¡Gracias!
Nordin
5
@Phong, para C # hay una regla sencilla: de forma predeterminada, todo es tan privado como puede ser. Los elementos de un espacio de nombres, como las clases no anidadas, no pueden ser privados, porque nada podría usarlos. Solo pueden ser internos o públicos; por lo que, de forma predeterminada, son internos. Las cosas dentro de otras cosas (enumeraciones dentro de una clase; clases anidadas; propiedades; campos; métodos ...) son privadas por defecto.
Ryan Lundy
11

privateagrega desorden visual. A aquellos que insisten en que hace las cosas explícitas, les pregunto: ¿Hacen esto también con las matemáticas? Por ejemplo:

var answer = a + b / c;

¿Le parece poco claro sin paréntesis redundantes b / c?

La regla en C # es muy simple: de forma predeterminada, todo es lo más privado posible. Entonces, si necesita que algo sea más visible que el predeterminado, agregue un modificador. De lo contrario, no agregue palabras clave innecesarias a su código.

Ryan Lundy
fuente
1
Solía ​​estar de acuerdo con este derecho antes de hacer la pregunta. Pero, algunas personas escriben VB, algunas C ++, algunas incluso F # (¿viniendo de otros lenguajes funcionales como Haskell, quizás?), Mejor que en C #. Entonces, para ellos (y para nosotros si lo olvidamos después de 2 años sin c # ing) es mejor si los accesos son explícitos. No subestime el impacto que el aprendizaje fácil tiene en un proyecto, muchos desarrolladores provienen de entornos que pueden no reflejar la herramienta elegida, y necesitan ayudas de aprendizaje, incluso en el código de producción, esto no está nada mal (y sabemos que muchos codifica muy mal C #, por lo que algunas ayudas también nos ayudan).
Camilo Martin
3
Bueno, claro, en VB los valores predeterminados son atroces. Creo que la visibilidad predeterminada es Friendpara miembros, por ejemplo. C # hace sus valores predeterminados de visibilidad de la manera correcta: las cosas se establecen en la menor visibilidad posible a menos que se modifiquen. Por lo que puedo encontrar, parece que lo mismo es cierto para C ++ (excepto las estructuras). (No parece ser cierto para F #.)
Ryan Lundy
6
Me varresulta extraño que tanta gente esté a favor , porque reduce el desorden visual y, sin embargo, tanta gente está a favor de escribir sin sentido private.
Ryan Lundy
2
¡Incluso iría tan lejos como para argumentar que el desorden visual inhibe la legibilidad!
binki
1
upvoted a pesar de que no prefiero usar paréntesis en el caso de tu ejemplo matemáticas.
Marc.2377
7

Hasta donde yo sé, privado es el valor predeterminado en todas partes en C #

Declarar explícitamente privado significa que sabe que es privado. No solo piense que lo es, porque hasta donde usted sabe, es el predeterminado. También significa que alguien más que mira el código sabe qué es.

No hay "Creo que lo es", "Estoy bastante seguro de que lo es", etc. Simplemente es . Y todos están en la misma página.

No soy un desarrollador de C # . Si tuviera que trabajar con algún código que no se declaró explícitamente privado , probablemente asumiría que es interno .

No me gusta cuando las cosas se establecen implícitamente. Nunca es tan claro como cuando se establecen explícitamente.

JD Isaacks
fuente
Suena razonable, incluso olvido los conceptos básicos de los idiomas que una vez conocí mejor.
Camilo Martin
6

Legibilidad: no todo el mundo puede saber que la privacidad es el comportamiento predeterminado.

Intención: da una indicación clara de que ha declarado específicamente la propiedad privada (por cualquier motivo).

James
fuente
5

La legibilidad, la demostración de intención son dos grandes razones en las que puedo pensar.

Maess
fuente
Convenido. Por ejemplo, si está trabajando con otros desarrolladores en un fragmento de código, establecer algo en privado ayuda a indicar su intención. También es útil cuando regresa a su código después de varios años y su IDE puede decirle qué métodos deberían ser de acceso público para esa clase.
Aaron Newton
3

Una buena razón para especificar explícitamente la visibilidad es que no tiene que pensar en cuál es el valor predeterminado para el contexto en el que se encuentra.

Otra buena razón es que FxCop te dice que lo hagas.

Patrick McDonald
fuente
+1, acabo de notar que FxCop se queja de que eliminé el modificador privado ahora cuando construí con el cambio.
Camilo Martin
2

Mucha gente (¡gente como yo!) Programa regularmente en un puñado de idiomas diferentes. Ser explícito con cosas como estas me evita tener que recordar todos los detalles arcanos de todos los lenguajes en los que programo.

davidtbernal
fuente
1
Bueno, yo no diría que "el modificador de acceso predeterminado es private" es un detalle arcano ... Pero entiendo el punto. El otro día tuve problemas para recordar cómo funcionaba el marco que usé la semana pasada ( MEF ).
Camilo Martin
0

Diría que por coherencia con la legibilidad del alcance del resto de la clase.

MGZero
fuente
4
Estás pensando en C ++. En C #, incluso en estructuras, los miembros son privados de forma predeterminada.
3
Las estructuras no tienen accesibilidad pública de forma predeterminada; consulte: msdn.microsoft.com/en-us/library/ba0a1yw2.aspx
Reed Copsey