Hay tantas formas de escribir getters y setters que me confunde. ¿Están estos dos haciendo lo mismo?

private List<MyClass> myPrivateList;

//Method 1
public List<MyClass> MyPublicList{ get => myPrivateList;  private set { } }

//Method 2
public List<MyClass> MyPublicList=> myPrivateList;

Y si es así, ¿esto me permite ver esta propiedad desde otra clase sin permitirme editarla?

Gracias :).

-1
Juan 24 jun. 2020 a las 23:48

2 respuestas

Los captadores en el método 1 y el método 2 son equivalentes. El método 1 también expone un setter que no hace nada, que no es lo mismo que el método 2. Eso generaría confusión, porque desde dentro de la clase de declaración le permite escribir cosas como

this.MyPublicList = new List<MyClass>();

Si bien esa línea parece que debería hacer algo, el cuerpo del setter está vacío, por lo que no hace nada. Creo que lo que vas a hacer sería no especificar el setter en absoluto:

public List<MyClass> MyPublicList { get => myPrivateList; }

Si do desea que el configurador sea utilizable de forma privada, entonces deberá definir el cuerpo:

public List<MyClass> MyPublicList { get => myPrivateList; private set => myPrivateList = value; }
2
Andrew Williamson 24 jun. 2020 a las 20:57
private MyType _member;
public MyType GetMember() { return _member; }
public void SetMember(MyType value) { _member = value };

Esta es la forma básica de proteger a un miembro privado con métodos públicos de obtención y establecimiento (una propiedad). Independientemente de cómo defina una propiedad, este es el equivalente en C # de lo que se creará en MSIL. Es por eso que tendrá la palabra clave value disponible en el setter. Cualquier otro método es simplemente azúcar sintáctico.

Las opciones son:

// Option 1
public MyType Member { get; set; }
// Option 2
private MyType _member;
public MyType Member 
{
   get
   {
      return _member;
   }
   set
   {
      _member = value;
   }
}
// Option 3
public MyType Member 
{
   get => _member;
   set => _member = value;
}
// Option 4
public MyType Member => _member; //Only a getter, yet even shorter.

Lo que puede hacer es no definir un establecedor, esto significa que no puede hacer una asignación con la propiedad externa como Member = new MyType(). Sin embargo, aún puede acceder a cualquier método desde el exterior, que a su vez cambia el valor de la estructura de datos subyacente como en Member.Clear(). Como señaló @Ruzihm en su excelente respuesta, tendría que hacer una copia de objetos para proporcionar una copia "poco interactiva", que ofrezca una protección "completa" del original.

1
Jirajha 24 jun. 2020 a las 21:56