Una propiedad es un miembro que proporciona un mecanismo flexible para leer, escribir o calcular el valor de un campo privado. Las propiedades se pueden usar como si fueran miembros de datos públicos, pero en realidad son métodos especiales llamados descriptores de acceso. Esto permite acceder fácilmente a los datos y aún así ayuda a promover la seguridad y flexibilidad de los métodos.
Las propiedades permiten que una clase exponga una forma pública los get y set, mientras oculta el código de implementación o verificación.
Se usa un descriptor de acceso de propiedad para devolver el valor de la propiedad, y se usa un descriptor de acceso de propiedad establecido para asignar un nuevo valor. Por ejemplo si queremos un atributo solo lectura y otro que se pueda acceder y asignar :
class Persona {
public long Dni { get; }
public string Nombre { get; set; }
public string Apellido { get; set; }
...
La palabra clave value se utiliza para definir el valor asignado por el descriptor de acceso set o init.
Las propiedades pueden ser de lectura y escritura (tienen un descriptor de acceso get y set), de solo lectura (tienen un descriptor de acceso get pero no un descriptor de acceso establecido) o de solo escritura (tienen un descriptor de acceso set, pero no un descriptor de acceso get). Las propiedades de solo escritura son raras y se utilizan con mayor frecuencia para restringir el acceso a datos confidenciales.
Las propiedades simples que no requieren un código de acceso personalizado se pueden implementar como definiciones de cuerpo de expresión o como propiedades implementadas automáticamente.
Un patrón básico para implementar una propiedad implica el uso de un campo de respaldo privado para establecer y recuperar el valor de la propiedad. El descriptor de acceso get devuelve el valor del campo privado, y el descriptor de acceso establecido puede realizar alguna validación de datos antes de asignar un valor al campo privado. Ambos accesadores también pueden realizar alguna conversión o cálculo en los datos antes de que se almacenen o devuelvan.
Veamos un ejemplo :
using System;
class TimePeriod
{
private double _seconds;
public double Hours
{
get { return _seconds / 3600; }
set {
if (value < 0 || value > 24)
throw new ArgumentOutOfRangeException(
$"{nameof(value)} must be between 0 and 24.");
_seconds = value * 3600;
}
}
}
class Program
{
static void Main()
{
TimePeriod t = new TimePeriod();
// The property assignment causes the 'set' accessor to be called.
t.Hours = 24;
// Retrieving the property causes the 'get' accessor to be called.
Console.WriteLine($"Time in hours: {t.Hours}");
}
}
// The example displays the following output:
// Time in hours: 24
Los descriptores de acceso a las propiedades a menudo consisten en declaraciones de una sola línea que simplemente asignan o devuelven el resultado de una expresión. Puede implementar estas propiedades como miembros con cuerpo de expresión. Las definiciones del cuerpo de la expresión consisten en el símbolo => seguido de la expresión para asignar o recuperar de la propiedad.
A partir de C # 6, las propiedades de solo lectura pueden implementar el descriptor de acceso get como un miembro con cuerpo de expresión. En este caso, no se utiliza ni la palabra clave get accessor ni la palabra clave return. El siguiente ejemplo implementa la propiedad Name de solo lectura como un miembro con cuerpo de expresión.
using System;
public class Person
{
private string _firstName;
private string _lastName;
public Person(string first, string last)
{
_firstName = first;
_lastName = last;
}
public string Name => $"{_firstName} {_lastName}";
}
public class Example
{
public static void Main()
{
var person = new Person("Magnus", "Hedlund");
Console.WriteLine(person.Name);
}
}
// The example displays the following output:
// Magnus Hedlund
A partir de C # 7.0, tanto el descriptor de acceso get como el set se pueden implementar como miembros con cuerpo de expresión. En este caso, las palabras clave get y set deben estar presentes. El siguiente ejemplo ilustra el uso de definiciones de cuerpo de expresión para ambos descriptores de acceso. Tenga en cuenta que la palabra clave return no se usa con el descriptor de acceso get.
using System;
public class SaleItem
{
string _name;
decimal _cost;
public SaleItem(string name, decimal cost)
{
_name = name;
_cost = cost;
}
public string Name
{
get => _name;
set => _name = value;
}
public decimal Price
{
get => _cost;
set => _cost = value;
}
}
class Program
{
static void Main(string[] args)
{
var item = new SaleItem("Shoes", 19.95m);
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
}
}
// The example displays output like the following:
// Shoes: sells for $19.95
En algunos casos, los descriptores de acceso de propiedad get y set simplemente asignan un valor o recuperan un valor de un campo de respaldo sin incluir ninguna lógica adicional. Al usar propiedades implementadas automáticamente, puede simplificar su código mientras el compilador de C# le proporciona de manera transparente el campo de respaldo.
Si una propiedad tiene tanto un descriptor de acceso get como un set (o un get y un init), ambos deben implementarse automáticamente. Usted define una propiedad implementada automáticamente usando las palabras clave get y set sin proporcionar ninguna implementación. El siguiente ejemplo repite el anterior, excepto que Nombre y Precio son propiedades implementadas automáticamente. El ejemplo también elimina el constructor parametrizado, por lo que los objetos SaleItem ahora se inicializan con una llamada al constructor sin parámetros y un inicializador de objeto.
using System;
public class SaleItem
{
public string Name
{ get; set; }
public decimal Price
{ get; set; }
}
class Program
{
static void Main(string[] args)
{
var item = new SaleItem{ Name = "Shoes", Price = 19.95m };
Console.WriteLine($"{item.Name}: sells for {item.Price:C2}");
}
}
// The example displays output like the following:
// Shoes: sells for $19.95
Dejo link: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/properties