Em que situação devo usar um conjunto privado em uma propriedade em vez de torná-lo uma propriedade ReadOnly? Leve em consideração os dois exemplos muito simplistas abaixo.
Primeiro exemplo:
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 exemplo:
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 produzem os mesmos resultados. É uma situação em que não há certo e errado, e é apenas uma questão de preferência?
public string Name { get; protected set; }
através da herança.Respostas:
Existem algumas razões para usar
private set
.1) Se você não está usando um campo de suporte e deseja uma propriedade automática somente leitura:
2) Se você deseja fazer um trabalho extra ao modificar a variável dentro da sua classe e deseja capturá-la em um único local:
Em geral, porém, é uma questão de preferência pessoal. Até onde eu sei, não há razões de desempenho para usar um sobre o outro.
fonte
private set
. :-)public string Name { get; }
. Se você não deseja uma propriedade mutável, essa é a sintaxe preferida agora.private set
é que não é tão imutável quanto gostamos de fingir. Se você deseja implementar uma classe verdadeiramente imutável, somente leitura é uma obrigação.Use conjunto privado quando quiser que o setter não possa ser acessado de fora .
Use somente leitura quando desejar definir a propriedade apenas uma vez . No construtor ou inicializador de variável.
TESTE ESTA:
fonte
readonly
palavra-chave C # é aplicadaReadOnly
ao campo, e não à propriedade.Posso sugerir uma terceira opção?
Isso torna a propriedade Name efetivamente somente leitura para todo o código externo e fornece um método Set explícito. Prefiro o conjunto explícito do que simplesmente usar o conjunto na propriedade Name porque você está alterando o valor ao defini-lo. Normalmente, se você definir um valor de propriedade, espera recuperar o mesmo valor ao chamar o get mais tarde, o que não aconteceria se você definisse o ToTitleCase no conjunto .
No entanto, como você disse, não há uma resposta certa.
fonte
A partir do C # 6.0, as propriedades automáticas somente de getter foram adicionadas ao idioma. Consulte aqui: https://github.com/dotnet/roslyn/wiki/New-Language-Features-in-C%23-6#getter-only-auto-properties .
Aqui está um exemplo:
fonte
Não use o segundo exemplo. O objetivo principal de usar uma propriedade - mesmo que não ocorra nada além do getter get e da configuração do setter - é canalizar todo o acesso através desse getter e setter, para que, se você precisar mudar o comportamento no futuro, tudo esteja em ordem. um lugar.
Seu segundo exemplo abandona isso no caso de definir a propriedade. Se você usasse essa abordagem em uma classe grande e complexa, e mais tarde precisasse mudar o comportamento da propriedade, estaria em busca e substituição de terrenos, em vez de fazer a alteração em um só lugar - o instalador particular.
fonte
Sempre que eu precisei alterar o nível de acesso de um setter, geralmente o alterei para Protected (somente esta classe e classes derivadas podem alterar o valor) ou Friend (somente membros da minha montagem podem alterar o valor).
Mas usar Privado faz todo sentido quando você deseja executar outras tarefas no setter, além de alterar o valor de apoio. Conforme mencionado anteriormente, é bom design não referenciar diretamente seus valores de apoio, mas acessá-los apenas por meio de suas propriedades. Isso garante que as alterações posteriores feitas em uma propriedade sejam aplicadas tanto internamente quanto externamente. E praticamente não há penalidade de desempenho em referenciar uma propriedade versus sua variável de suporte.
fonte
Mas, para esclarecer, acessar uma propriedade é mais lento que acessar sua variável de backup. O getter e o setter de uma propriedade são métodos que requerem uma chamada e um retorno, enquanto a variável de backup de uma propriedade é acessada diretamente.
É por isso que, nos casos em que o getter de uma propriedade pode ser acessado várias vezes em um bloco de código, o valor da propriedade é algumas vezes armazenado em cache primeiro (salvo em uma variável local) e a variável local usada em seu lugar. Obviamente, isso pressupõe que a propriedade não pode ser alterada de forma assíncrona enquanto o bloco está em execução.
fonte