2011-05-21 19 views
30

¿Cómo puedo hacer un getter público y un setter privado para una propiedad? Es el siguiente correcto?es Public getter y Private setter con el mismo nombre posible en C#?

public String Password 
{ 
    set { this._password = value; } 
} 

private String Password 
{ 
    get { return this._password; } 
} 
+2

su texto solicita contraseña de cadena pública {get; conjunto privado} pero su código es para contraseña de cadena pública {set; privado get;} uno de esos es obviamente incorrecto. – Yaur

+0

@Yaur: Buena captura, no me di cuenta. Pero cualquiera funcionará con la misma sintaxis. –

Respuesta

69

Sí, es posible, incluso con propiedades de automóviles. A menudo utilizo:

public int MyProperty { get; private set; } 
+0

¿Puedes explicar lo que dice este tipo acerca de tu respuesta? http: // stackoverflow.com/questions/1073392/how-often-do-you-see-abuse-of-c-sharp-shorthand-getters-setters ¿Está diciendo que no está bien hacerlo? Estoy confundido –

+2

Esa pregunta y la respuesta de Jon dice que hay casos en que esto no está bien, específicamente si el valor debe ser de solo lectura (no es posible configurarlo después de ejecutar ctor) es incorrecto usar una propiedad automática. Al igual que con cualquier función de idioma, existen usos correctos e incorrectos. –

+0

¡Gracias, realmente aprecio tu respuesta! –

3
public String Password 
{ 
    private set { this._password = value; } 
    get { return this._password; } 
} 

o puede utilizar una propiedad de auto-aplicado:

public String Password { get; private set; } 
+2

esto hará que ambos públicos ¿verdad? Quiero hacer que el método getter solo esté disponible para clasificarse, significa privado. – BlueBird

+0

El primer bit de código no es correcto. No hace lo que se solicita. El segundo bit funciona. – Cheeso

+0

Lo arreglé. Ahora es correcto –

2
public String Password 
{ 
    private set { this._password = value; } 
    get { return this._password; } 
} 

MSDN:

Los métodos get y set son generalmente sin diferente de otros métodos. Ellos puede realizar cualquier lógica del programa, tiran excepciones que sea ésta, y ser declarado con los modificadores permitidos por el lenguaje de programación.

Editar: MSDN cita es sólo para aclarar por qué geter y colocador pueden tener diferentes mdofiers acceso, buena cuestión planteada por @Cody Grey:

Sí, las propiedades se pueden realizar programa de lógica y lanzar excepciones . Pero ellos no deberían. Las propiedades se pretende que sea métodos muy ligeros, comparables a acceder a un campo. El programador debe esperar para poder utilizarlos como lo harían con un campo sin ningún notables de rendimiento implicaciones. De modo que se desaconseja encarecidamente una lógica de programa demasiado pesada . Y mientras que los emisores pueden lanzar excepciones si es necesario, captadores deben casi Nunca lanzar excepciones

+0

Es interesante, podemos configurar elementos individuales ¿no? – BlueBird

+0

No realmente si lo piensas, no son diferentes de otras funciones. – YetAnotherUser

+0

Este código no se compila: no puede especificar 'public' dos veces. – svick

2

public string Password { get; private set; }

11

Sí, a partir de C# 2.0, se pueden especificar diferentes niveles de acceso para el comprador y el colocador de una propiedad.

pero usted tiene la equivocada sintaxis: se debe declarar como parte de la misma propiedad. Simplemente marque el que desea restringir con private. Por ejemplo:

public String Password 
{ 
    private get { return this._password; } 
    set { this._password = value; } 
} 
0

Para obtener insignia una 'excavadora', y para que la respuesta al día - campos de sólo lectura encapsulados por una obtención de propiedad de sólo

private readonly int myVal; 
public int MyVal get { return myVal; } 

puede ser ahora (a partir de C# 6.0) abreviado a

public int MyVal { get; } 
Cuestiones relacionadas