Soy algo nuevo en C # y acabo de descubrir que: en C # todos los campos y métodos en una clase son privados por defecto. Lo que significa que esto:
class MyClass
{
string myString
}
es lo mismo que:
class MyClass
{
private string myString
}
Entonces, debido a que son los mismos, ¿debería usar la palabra clave private en los campos y métodos? Muchos ejemplos de código en línea usan la palabra clave private en su código, ¿por qué es eso?
c#
programming-practices
coding-style
code-quality
user3210251
fuente
fuente
private
. Es menos disonancia cognitiva para mí si siempre puedo esperar ver el especificador de alcance como la primera parte de una declaración de identificador. Me toma menos tiempo leer "privado" que darme cuenta de que la primera palabra no es un especificador de alcance y, oh sí, eso significa que es una declaración de miembro privado. Escribir código también se trata de tener que leerlo más tarde.Respuestas:
Solo porque puede omitir saltos de línea e indentaciones y su compilador de C # todavía entenderá lo que quiere decirle, no es automáticamente una buena idea hacerlo.
es mucho menos legible para el lector humano que:
Y ese es todo el punto aquí: los programas están escritos para dos audiencias:
El último es el que necesita comprender y comprender rápidamente el significado de lo que está escrito. Debido a esto, hay algunas buenas prácticas que han surgido a lo largo de los años y son cuasi-normas más o menos comúnmente aceptadas. Una de ellas es poner palabras clave de alcance explícito, otro ejemplo es poner paréntesis adicionales alrededor de expresiones complejas, incluso en casos en los que no serían necesarios sintácticamente, como:
fuente
5 + 5 * 5
es30
, no50
como algunos podrían esperar a primera vista.**private** static void Main()
? :)C # no es el único lenguaje de programación para .NET; otros idiomas pueden tener accesibilidad predeterminada diferente en varios contextos. La especificación
private
dejará en claro a cualquiera que lea el código que dicha accesibilidad está destinada, mientras que omitir la especificación deja abierta la pregunta de si el miembro podría haber sido, por ejemplo, destinado a ser utilizable dentro del ensamblado [como sería el valor predeterminado en VB.NET] . Ser explícito puede ser especialmente útil si uno usa múltiples idiomas con diferentes reglas.Con respecto a si se debe favorecer
private
oprotected
no en ausencia de un argumento particularmente convincente a favor del otro, la decisión debe basarse en si es más probable que exponer a un miembro haga posible que una clase derivada haga algo útil que de lo contrario no sería posible, o que evitaría que futuras versiones de una clase modifiquen sus estructuras internas de datos de una manera que sería más eficiente. Uno puede ver ejemplos de ambas situaciones enList<T>
.En algunos casos, si uno tiene una lista de agregados (por ejemplo,
Point
estructuras), puede ser útil actualizar los elementos en el lugar. Si seList<T>
expone su almacén de respaldo a clases derivadas, se podría definir fácilmenteEditableList<T>
un método con:que luego se podría invocar usando algo como:
Tal método podría permitir actualizaciones eficientes incluso con tipos de estructura relativamente grandes [ya que no se requeriría copia]. El hecho de que
List<T>
no exponga sus componentes internos hace que sea imposible derivar una clase que pueda implementar dicho operador de manera eficiente.Por otro lado, aunque hasta donde yo sé, Microsoft aún no ha explotado esta capacidad, tener la tienda de respaldo en privado permitiría que una versión futura de
List<T>
dividir la tienda de respaldo en partes que fueran menores de 85K cuando se usa la mayoría de los datos tipos, o más pequeños que 1000 artículos cuando se usadouble
. Tal división no sería posible siList<T>
hubiera expuesto el almacén de respaldo a clases derivadas.fuente
int myField
yprivate int myField
para ser diferente. Por lo tanto, no creo que no agregar privado lo deje abierto a la interpretación para otros lenguajes .NET.Sí, debe usarlo
private
:) La palabra clave se usa porque es una práctica generalmente aceptada y elimina todas las dudas sobre el alcance previsto de un miembro de la clase.La legibilidad es muy importante con el código, especialmente cuando se trabaja en equipo. Si desea ver más la legibilidad del código, un buen libro de referencia que puedo recomendar es The Elements of C # Style .
fuente
Pregunta:
"¿Debería usar private en campos y métodos en C #?"
Respuesta rápida:
Sí, pero depende de la lógica de su código.
Respuesta extendida larga y aburrida:
Sugiero, siempre especifique la visibilidad para los miembros.
Creo que es un buen enfoque declarar miembros, por defecto, como "privados".
En el mundo real, uso "protegido" en su lugar.
Tarde o temprano, ese miembro oculto podría ser utilizado por una subclase.
A veces, una buena pregunta puede responderse mejor haciendo la pregunta opuesta.
La pregunta opuesta, a su pregunta, podría ser algo como:
"¿Debo usar siempre el modificador de acceso público en campos y métodos en C #"
En otros lenguajes de programación puede "promocionar" protegido al público, dependiendo de su diseño.
Utilizo muchas bibliotecas de jerarquía profunda de control (visual), donde se requieren algunos miembros (propiedades, métodos).
A veces, es mejor tenerlos públicos, a veces no.
fuente