.NET Properties - ¿Usar la propiedad Private Set o ReadOnly?

¿En qué situaciones debo utilizar un Set Privado en una propiedad frente a convertirla en una propiedad de Sólo Lectura? Tenga en cuenta los dos ejemplos muy simplistas a continuación.

Primer ejemplo:

Public Class Person

    Private _name As String

    Public Property Name As String
        Get
            Return _name
        End Get
        Private Set(ByVal value As String)
            _name = value
        End Set
    End Property

    Public Sub WorkOnName()

        Dim txtInfo As TextInfo = _
            Threading.Thread.CurrentThread.CurrentCulture.TextInfo

        Me.Name = txtInfo.ToTitleCase(Me.Name)

    End Sub

End Class

// ----------

public class Person
{
    private string _name;
    public string Name
    {
        get { return _name; }
        private set { _name = value; }
    }

    public void WorkOnName()
    {
        TextInfo txtInfo = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo;
        this.Name = txtInfo.ToTitleCase(this.Name);
    }
}

Segundo ejemplo:

Public Class AnotherPerson

    Private _name As String

    Public ReadOnly Property Name As String
        Get
            Return _name
        End Get
    End Property

    Public Sub WorkOnName()

        Dim txtInfo As TextInfo = _
            Threading.Thread.CurrentThread.CurrentCulture.TextInfo

        _name = txtInfo.ToTitleCase(_name)

    End Sub

End Class

// ---------------

public class AnotherPerson
{
    private string _name;
    public string Name
    {
        get { return _name; }
    }

    public void WorkOnName()
    {
        TextInfo txtInfo = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo;
        _name = txtInfo.ToTitleCase(_name);
    }
}

Ambos dan los mismos resultados. ¿Se trata de una situación en la que no existe lo correcto y lo incorrecto, y es sólo una cuestión de preferencia?

Solución

Hay un par de razones para utilizar private set.

  1. Si no está utilizando un campo de respaldo en absoluto y desea una propiedad automática de sólo lectura:
public string Name { get; private set; }   

public void WorkOnName()
{
    TextInfo txtInfo = Thread.CurrentThread.CurrentCulture.TextInfo;
    Name = txtInfo.ToTitleCase(Name);
}  
  1. Si quieres hacer un trabajo extra cuando modificas la variable dentro de tu clase y quieres capturar eso en una sola ubicación:
private string _name = string.Empty;
public string Name 
{ 
    get { return _name; }
    private set 
    {
        TextInfo txtInfo = Thread.CurrentThread.CurrentCulture.TextInfo;
        _name = txtInfo.ToTitleCase(value);
    }
}

En general, sin embargo, es una cuestión de preferencia personal. Hasta donde yo sé, no hay razones de rendimiento para utilizar uno sobre el otro.

Comentarios (5)

¿Puedo sugerir una tercera opción?

public class Person
{
    public string Name { get; protected set; }

    public void SetName(string name)
    {
        TextInfo txtInfo = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo;
        this.Name = txtInfo.ToTitleCase(name);
    }
}

Esto hace que la propiedad Name sea efectivamente Read Only para todo el código externo y proporciona un método Set explícito. Prefiero el Set explícito en lugar de usar simplemente set en la propiedad Name porque estás cambiando el valor cuando lo estableces. Normalmente si set el valor de una propiedad, esperas obtener el mismo valor de vuelta cuando llamas a get más tarde, lo que no ocurriría si hicieras tu ToTitleCase en el set.

Sin embargo, como usted dijo, no hay una respuesta correcta.

Comentarios (2)

No utilice el segundo ejemplo. El objetivo de utilizar una propiedad -incluso si no ocurre nada más allá de que el getter obtenga y el setter establezca- es canalizar todos los accesos a través de ese getter y setter para que, si alguna vez necesita cambiar el comportamiento en el futuro, todo esté en un solo lugar.

Tu segundo ejemplo abandona eso en el caso de establecer la propiedad. Si utilizas este enfoque en una clase grande y compleja, y más tarde necesitas cambiar el comportamiento de la propiedad, estarás en la tierra de buscar y reemplazar, en lugar de hacer el cambio en un solo lugar - el setter privado.

Comentarios (0)