Existe uma maneira melhor de usar getters e setters em membros privados de uma classe?

5

Eu tenho esta classe de exemplo:

public class Carrots
{
    private string name;

    public void SetName(string pName)
    {
        name = pName;
    }

    public string GetName()
    {
        return name;
    }
}

Eu tenho o membro da classe definido como particular e para definir e obter esse membro, eu fiz métodos get e set. Existe uma maneira de tornar esse código mais curto e fácil de ler em um piscar de olhos?

    
por Gigabit 25.03.2017 / 02:50
fonte

3 respostas

5

Usando propriedades

Um getter e setter adequado seria assim:

public class Carrots
{
    private string name;

    public string Name
    {
        get { return name; }
        set { name = value; }
    }
}

( Clique aqui se você não entender o papel da palavra-chave value neste exemplo).

Usando propriedades automáticas

No c # 3.0 e posterior, você também pode usar as propriedades automáticas , tornando-o ainda mais mais fácil.

public class Carrots
{
    public string Name { get; set; }
}

Se você quiser que a propriedade pública seja somente leitura (mas ainda assim queira um setter privado), você pode usar:

public class Carrots
{
    public string Name { get; private set; }
}

Como chamar

Em ambos os casos, você chamaria assim:

var c = new Carrots();
c.Name = "This is a test!";
Console.WriteLine(c.Name); //outputs "This is a test!"
    
por 25.03.2017 / 03:06
fonte
0

Mais breve e mais fácil de ler seria algo semelhante a:

public class Carrots
{
    public string Name { get; set; }
}

Isso usa uma variável interna privada que é usada quando a propriedade é acessada. Equivalente a:

public class Carrots
{
    private string _name;

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

(Como o @John Wu demonstrou.)

No entanto, isso dependerá do que você deseja que o código externo acesse.

Se você quiser apenas que um 'Nome' seja instantaneamente alterável e não tenha relação com o aplicativo, o nome da cadeia pública acima {get; conjunto; } é tudo que você precisa.

Mas se você estiver rastreando / usando / controlando o valor de uma propriedade dentro da sua classe e não quiser que o código externo a altere, então o segundo exemplo é o único a seguir.

Por exemplo:

Você tem uma classe criada com um valor conhecido. Você quer que esse valor seja alterado - mas sob seu controle.

Um saldo bancário, talvez? Ou a velocidade de um carro?

Vamos com a velocidade de um carro:

public class Car
{
    private string _speed;

    public string Speed
    {
        get { return _speed; }
    // Notice no setter in this case.
    }

    public void IncreaseSpeed()
    {
        if(_speed + 1 <= 100)
        {
            _speed++;
        }
    }

    public void Brake()
    {
        if(_speed-- >= 0)
        {
            _speed--;
        }
    }
}

Isso permite que o código de chamada ligue para aumentar a velocidade ou diminuir a velocidade do freio, quantas vezes quiser. Mas agora você pode colocar um limite realista nessa velocidade - o usuário não pode quebrar as regras que você tem no 'mundo' de seu aplicativo.

Aqui está outro exemplo, mas o código externo pode definir o valor imediatamente:

public class Car
{
    private string _speed;

    public string Speed
    {
        get { return _speed; }
        set {
                if (value >= 0 && value <= 100)
                {
                    _speed = value;
                }
            }
    }
}

Isso agora permite que o código de chamada lide com aceleração e frenagem, atualizando o objeto Car quando quiser. Mas você ainda tem o controle geral de qual valor pode ser, em vez de controlar como isso é alterado.

Usando:

public class Carrots
{
    public string name;
}

como demonstrado pelo @Charles Merriam, tudo bem se você não se importa quando e a que valor o código externo irá definir essa propriedade. É sempre público e nunca verificado quando alterado.

Ele nunca deve ser acessado pelos métodos internos da sua classe se ele exigir limites quanto ao estado em que deve estar ou requer um determinado intervalo. Você precisaria usar a lógica de verificação de limites em todos os lugares que a acessa (então, manipular quaisquer erros se as verificações falharem), em vez de impedir a entrada de dados inválidos.

    
por 28.03.2017 / 21:39
fonte
-2

Apenas algumas coisas rápidas:

  • Você está usando getters e setters no construto devido a limitações em seu idioma e sua incapacidade de inibir o operador 'address of' dos membros.
  • Você está usando getters e setters porque pode haver, possivelmente, um futuro no qual você substitui os itens de dados por funções complexas e o idioma não suporta a substituição de '.' operador corretamente.
  • Você está usando getters e setters porque todo mundo faz isso, torna-se parte do lore e parte do cronograma de desenvolvimento e do inchaço da velocidade do executável.

Se estiver trabalhando em equipe, uma abordagem alternativa é despejar os getters e setters, usar acesso direto aos campos e conversar com o desenvolvedor fazendo algo estúpido em campo.

Então você escreve:

public class Carrots
{
    public string name;
}

e acesso como myCarrot.name

    
por 26.03.2017 / 20:29
fonte