2009-02-19 16 views
7

No estoy seguro si esto correctamente redactado ... pero tengo el siguiente código:¿Cómo establecer el valor de una propiedad de solo lectura con getters y setters genéricos?

public Guid ItemId 
    { 
     get; 
    } 

    public TransactionItem() 
    { 
     this.ItemId = Guid.Empty; 
    } 

Naturalmente que estoy recibiendo un tema de sólo lectura ... que entiendo. ¿Hay alguna forma para establecer este valor de la propiedad sin tener que hacer algo como el siguiente:

Guid _itemId = Guid.Empty; 
    public Guid ItemId 
    { 
     get 
     { 
      return _itemId; 
     } 
     set 
     { 
      _itemId = value; 
     } 
    } 

o

public Guid ItemId 
    { 
     get; 
     internal set; 
    } 

Gracias de antemano!

Respuesta

29

me gustaría ir para esto:

public Guid ItemId 
{ 
    get; 
    private set; // can omit as of C# 6 
} 

public TransactionItem() 
{ 
    this.ItemId = Guid.Empty; 
} 

Por supuesto, sería abierta para establecer dentro de esta clase, pero ya que usted está escribiendo espero que tenga el sentido de no romper sus propias intenciones ..

En mi opinión, las cosas como las propiedades de solo lectura, son en su mayoría importantes cuando se ven desde el exterior. Desde el interior, realmente no importa qué es, porque allí, usted es el Rey =)

+0

+1 mucha gente no se da cuenta de que los accesorios pueden tener diferentes ámbitos – annakata

+1

¡Parece que voy a seguir así! ¡Gracias! Era más o menos curioso para ver si se podía hacer sin tener un "conjunto". – mattruma

+0

abrir la puerta de una casa sin puerta es bastante difícil ...: p – Svish

2

Puede utilizar la palabra clave readonly

public readonly Guid ItemId; 

public TransactionItem() 
{ 
    this.ItemId = Guid.Empty; 
} 
+0

@Jakub, La fabricación de sus campos no privada es algo que no debe hacer a menos que * absolutamente * necesites: http://csharpindepth.com/Articles/Chapter8/PropertiesMatter.aspx – LukeH

2

Me temo que su pregunta no está muy claro - pero si no hay un regulador de propiedad definida, entonces ciertamente no puedo llamo.

¿Eres en realidad después de una propiedad de solo lectura implementada automáticamente, que permite la configuración solo dentro del constructor? Si es así, me temo que no está disponible, tanto como me gustaría.

Sólo para ampliar lo que quiero decir, me gusta a ser capaz de hacer:

// Not valid in C# - yet! 
public class Foo 
{ 
    // Autogenerated field would be readonly in IL. 
    public string Name { get; readonly set; } 

    public Foo (string name) 
    { 
     this.Name = name; 
    } 

    public void Bar() 
    { 
     // This would be invalid 
     this.Name = "No!"; 
    } 
} 

Básicamente sería "hacer que una propiedad como un campo de sólo lectura."

+0

No creo que lo haya redactado correctamente ... pero lo que dices es correcto. Solo trato de guardar algo de mecanografía ... y tenía curiosidad por encima. – mattruma

+0

No hay problema.He editado la respuesta para mostrar lo que me gustaría poder hacer, creo que es lo que quieres también. –

0

¿Utiliza un ajustador privado o establece el campo de respaldo?
(Pero debe asegurarse de que el nombre del campo de respaldo se puede determinar según el nombre de la propiedad.
Por ejemplo, asegúrese de que su campo de respaldo siempre tenga el mismo nombre que el nombre de la propiedad, pero se antepone con un guión bajo, como NHibernate lo hace usando sus estrategias de acceso).

4

Si solo necesita que la propiedad ItemId sea de solo lectura para los usuarios externos de su clase, entonces la respuesta de Svish es el camino a seguir.

Si necesita ItemId a ser de sólo lectura dentro de la clase en sí, entonces usted tendrá que hacer algo como esto:

private readonly Guid _ItemId 
public Guid ItemId 
{ 
    get { return _ItemId; } 
} 

public TransactionItem() 
{ 
    _ItemId = Guid.Empty; 
} 
+0

Una solución mucho mejor que la respuesta aceptada –

Cuestiones relacionadas