Pergunta

Eu tenho a classe simples usando properies implementado auto-:

Public Class foo
{
    public foo() { }  

    public string BarName {get; set;}
}

Eu, obviamente, usar a BarName variável ao longo da minha classe e agora precisa adicionar lógica quando o valor da propriedade é definido (deve ser todas as letras maiúsculas, vai a figura). Isso significa que eu preciso agora criar uma variável privada para BarName, por exemplo, _BarName, e alterar a variável BarName corrente utilizada ao longo da minha classe para _BarName?

Public Class foo
{
    public foo() {}  

    private string _BarName = "";
    public string BarName 
    { 
        get {return _BarName;}
        set {_BarName = Value.ToString().ToUpper();}
    }
}

Eu estou tentando me certificar de que compreender as implicações do uso de propriedades implementadas automaticamente, e o que implicará na estrada quando / se eu preciso mudar alguma coisa. Estou assumindo que o refatoramento, como mostrado acima, não é uma quebrando mudança porque a propriedade é basicamente permanecer o mesmo; ele só teve um pouco de trabalho dentro da classe para mantê-lo dessa forma e adicionar a lógica necessária.

Outro exemplo, que pode ser mais significativo é que eu preciso chamar algum método quando um setter ou getter é usado; mais, em seguida, alterar o valor.

Isto parece uma feira fora das linhas e linhas de código para propriedades de configuração.

Foi útil?

Solução

Isso significa que eu preciso agora criar uma variável privada para BarName

Sim

e alterar a BarName atual variável utilizada ao longo da minha classe

Não altere o resto do código em sua classe para usar a nova variável privada que você cria. BarName , como uma propriedade, destina-se a esconder a variável privada (entre outras coisas), com a finalidade de evitar as mudanças radicais que você contemplar para o resto do seu código.

Estou assumindo que o refactoring, como mostrado acima, não é uma alteração significativa porque a propriedade é basicamente permanecendo o mesmo; ele só teve um pouco de trabalho para mantê-lo dessa maneira e adicione a lógica necessária.

correta.

Outras dicas

Você não precisa mudar nada. Propriedades implementadas automaticamente são apenas açúcar sintático. O compilador está gerando a variável privada e obter lógica / set para você, por trás dos bastidores. Se você adicionar sua própria lógica getter / setter o compilador irá utilizar o seu código em vez do seu código gerado automaticamente, mas tanto quanto os usuários de que a propriedade está em causa, nada mudou; qualquer código referenciar a sua propriedade continuará a trabalho.

Ao usar propriedades automáticas você não tenha acesso directo à variável "apoio" subjacente e você não tenha acesso à lógica real que é implementado na propriedade getter e setter. Você só tem acesso à propriedade (daí usando BarName todo o seu código).

Se você precisa agora de implementar a lógica específica no setter, você não pode mais usar propriedades automáticas e necessidade de implementar a propriedade da forma "antiquado". Neste caso, você precisará implementar sua própria variável de apoio privado (o método preferido, pelo menos para mim, é nomear a variável de apoio privado o mesmo nome que a propriedade, mas com uma minúscula inicial (neste caso, o apoio variável seria nomeado barName). Você, então, implementar a lógica apropriada no getter / setter.

No seu exemplo, você está correto que não é uma mudança de ruptura. Este tipo de refatoração (passando de propriedades automáticas para propriedades "normais" nunca deve ser uma alteração de quebra que você não está mudando a interface pública (o nome ou a acessibilidade da propriedade pública).

Não use propriedades automáticas se você sabe que você está indo para validar esse objeto. Esses objetos podem ser objetos de domínio etc. Como se você tiver uma classe Cliente, em seguida, usar variáveis ??privadas, porque pode ser necessário para validar o nome, data de nascimento etc. Mas se você estiver usando uma classe Rss então será aprovado usar apenas as propriedades automáticas já que não há ser validação executar e a classe é apenas usado para armazenar alguns dados.

Você está correto sobre a refatoração e ele realmente não deve quebrar nada.

Quer ou não você realmente precisa para percorrer as referências dentro da classe para o nome da propriedade e mudar aqueles para se referir ao campo privado vai depender de se o código interno necessário para o acesso a representação subjacente dos dados, em vez de como ele foi apresentado aos consumidores da classe. Na maioria dos casos, você pode deixar muito sozinho.

No seu exemplo simples seria sensato para deixar bem bastante sozinho e garantir que nenhum código interno para a classe poderia subverter a conversão / formatação que está sendo executada no setter.

Se, por outro lado, o getter estava fazendo alguma mágica para mudar a representação interna do campo para a forma como os consumidores necessários para visualizar os dados, então talvez (em alguns casos) o código interno dentro da classe seria necessário para acessar o campo .

Você precisa olhar para cada ocorrência do acesso à auto-propriedade na classe e decidir se ele deve estar tocando o campo ou usando a propriedade.

propriedades automáticas são apenas açúcar sintático, o compilador na verdade cria o membro privado para isso, mas uma vez que é gerado em tempo de compilação, você não pode acessá-lo.

E, mais tarde, se você quiser implementar getters e setters para a propriedade, só então você cria um membro privado explícita para ele e adicione a lógica.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top