2011-06-14 19 views
23

(inspirado en this comment)¿Necesita C# la palabra clave privada?

¿Hay alguna situación en la que necesidad de utilizar la palabra clave private?
(En otras palabras, una situación en la que omitir la palabra clave daría lugar a un comportamiento diferente)

+0

He eliminado mi respuesta, ya que resulta que no se puede tener un delegado privado en el ámbito del espacio de nombres. –

+0

Exactamente. Un tipo 'privado' no anidado no tiene ningún sentido; sería lo mismo que 'interno'. – SLaks

Respuesta

47
public class Foo 
{ 
    public int Bar { get; private set; } 
} 

Omitir la palabra 'privado' cambiaría la accesibilidad.

+1

Correcto. No estoy seguro de por qué no pensé en eso. – SLaks

+0

Tenga en cuenta que esta característica (accesadores de visibilidad mixta) es nueva para C# 2.0 – SLaks

+7

@SLaks: Por supuesto, C# 2.0 se envió hace seis años, por lo que "nuevo para C# 2.0" es un poco oxímoron. El acceso mixto en una propiedad ha sido una característica del lenguaje desde hace mucho tiempo. –

1

private no trata del comportamiento en tiempo de ejecución. Es para mantener su aplicación mantenible. Lo que está oculto por private solo puede afectar el código fuera de su clase a través de los miembros public o protected.

Así que la respuesta es 'no' para el comportamiento en tiempo de ejecución, 'sí' para el comportamiento del desarrollador!

+0

Entiendo eso; Me refería al comportamiento en tiempo de compilación y metadatos. – SLaks

+1

la pregunta parece ser más sobre el hecho de que si omite por completo el modificador de acceso, casi siempre resulta en acceso 'privado' por defecto. Como sugieren las dos respuestas ahora, sin embargo; es solo 'casi'. –

8

una situación en la que la omisión de la palabra clave [private] daría lugar a un comportamiento diferente respuesta de

David guiñada dio la situación más habitual. Aquí es otra:

En Account_generated.cs:

// Generated file. Do not edit! 

public partial class Account 
{ 
    ... 

    private partial class Helper 
    { 
    ... 
    } 

    ... 
} 

En AccountHandCoded.cs:

public partial class Account 
{ 
    ... 

    public partial class Helper 
    { 
    ... 
    } 

    ... 
} 

El código anterior no se compilará. La primera "parte" de Accountrequiere la clase anidada Helper para ser private. ¡Por lo tanto, el intento del codificador manual de hacer público Helper debe fallar!

Sin embargo, si la primera parte de la clase simplemente hubiera omitido la palabra clave private, todo se compilaría.

Así que para partial clases (y estructuras, interfaces), la declaración de acceso libre nivel

partial class Name 

significa "se permite que las otras 'partes' de esta clase para decidir cuál debe ser la accesibilidad".

Considerando que dar explícitamente la accesibilidad predeterminada (que es internal para tipos anidados y private para anidados) significa que "esta clase debe tener el acceso más restringido posible, y las otras 'partes' no pueden cambiar ese hecho".

Cuestiones relacionadas