c# - son - Cuándo se debe usar Solo lectura y Obtener solo propiedades
propiedades c# get set (5)
Crear una propiedad con solo un getter hace que su propiedad sea de solo lectura para cualquier código que esté fuera de la clase.
Sin embargo, puede cambiar el valor utilizando los métodos proporcionados por su clase:
public class FuelConsumption {
private double fuel;
public double Fuel
{
get { return this.fuel; }
}
public void FillFuelTank(double amount)
{
this.fuel += amount;
}
}
public static void Main()
{
FuelConsumption f = new FuelConsumption();
double a;
a = f.Fuel; // Will work
f.Fuel = a; // Does not compile
f.FillFuelTank(10); // Value is changed from the method''s code
}
Establecer el campo privado de su clase como de readonly
permite establecer el valor del campo solo una vez (usando una asignación en línea o en el constructor de la clase). No podrás cambiarlo más tarde.
public class ReadOnlyFields {
private readonly double a = 2.0;
private readonly double b;
public ReadOnlyFields()
{
this.b = 4.0;
}
}
Los campos de clase de readonly
se usan a menudo para las variables que se inicializan durante la construcción de la clase, y nunca se cambiarán más adelante.
En resumen, si necesita asegurarse de que el valor de su propiedad nunca se modifique desde el exterior, pero necesita poder cambiarlo desde dentro de su código de clase, use una propiedad de "solo obtener".
Si necesita almacenar un valor que nunca cambiará una vez que se haya establecido su valor inicial, use un campo de readonly
.
En una aplicación .NET, ¿cuándo debería usar las propiedades "ReadOnly" y cuándo debería usar simplemente "Get"? Cuál es la diferencia entre estos dos.
private readonly double Fuel= 0;
public double FuelConsumption
{
get
{
return Fuel;
}
}
o
private double Fuel= 0;
public double FuelConsumption
{
get
{
return Fuel;
}
}
Los métodos sugieren que algo tiene que suceder para devolver el valor, las propiedades sugieren que el valor ya está allí. Esta es una regla general, a veces puede querer una propiedad que hace un poco de trabajo (es decir, Count
), pero en general es una forma útil de decidir.
Se dice que una propiedad que tiene solo un getter es de solo lectura. Porque no se proporciona ningún setter, para cambiar el valor de la propiedad (desde afuera).
C # tiene una palabra clave de readonly , que se puede usar en campos (no en propiedades). Un campo que está marcado como "de solo lectura", solo se puede establecer una vez durante la construcción de un objeto (en el constructor).
private string _name = "Foo"; // field for property Name;
private bool _enabled = false; // field for property Enabled;
public string Name{ // This is a readonly property.
get {
return _name;
}
}
public bool Enabled{ // This is a read- and writeable property.
get{
return _enabled;
}
set{
_enabled = value;
}
}
las propiedades de solo lectura se utilizan para crear un código de seguridad. me gusta mucho la serie de publicaciones de Encapsulation de Mark Seemann sobre propiedades y campos de respaldo:
http://blog.ploeh.dk/2011/05/24/PokayokeDesignFromSmellToFragrance.aspx
tomado del ejemplo de Marcos:
public class Fragrance : IFragrance
{
private readonly string name;
public Fragrance(string name)
{
if (name == null)
{
throw new ArgumentNullException("name");
}
this.name = name;
}
public string Spread()
{
return this.name;
}
}
en este ejemplo, usa el campo de nombre de solo lectura para asegurarse de que la clase invariante siempre sea válida. en este caso, el compositor de la clase quería asegurarse de que el campo del nombre esté establecido solo una vez (inmutable) y esté siempre presente.
A partir de C # 6 , puede declarar e inicializar una ''propiedad de solo lectura'' en una línea:
double FuelConsumption { get; } = 2;
Puede establecer el valor del constructor pero no de otros métodos.