Solucionado (ver solução)
Solucionado
(ver solução)
7
respostas

Duvida com encapsulamento e modificadores de acesso

Pessoal, estou com 2 dúvidas, a primeira é: Já que eu posso declarar uma variável publica e utilizar as propriedades dela da maneira que eu quiser ex:() public int teste {get; private set;} () eu vou praticamente sempre declarar os atributos de uma classe como public e encapsular pelas properties e o private vai meio que entrar em desuso?

E a outra dúvida é, por padrão, quando eu declaro uma classe: ("Class testando{}") o modificador de acesso padrão dela vai ser o que? ("public, private ...")? Desde já agradeço!!

7 respostas

O modificador de acesso padrão do C# é o internal

https://msdn.microsoft.com/pt-br/library/7c5ka91b.aspx

E quanto ao encapsulamento, o private não tem como cair em desuso. Imagine a propriedade Saldo de uma Conta. A única forma que você poderia alterar o saldo é através de métodos como Deposita, Saca, Transfere, etc. Você nunca deveria poder manipular a propriedade Saldo diretamente, se não você pode aumentar e diminuir o saldo como quiser, sem nenhuma regra, o que está extremamente errado!!! Para evitar isso, usamos o private.

Claro arthur, mas é ai que ta minha duvida, eu declarando a variavel saldo como public e colocando as propreties dela {private get; private set} seria a mesma coisa que declarar ela como privada, correto?

Talvez os termos que estejam confundindo. Vou separar:

Variável:

class Conta
{
  private void button1_click(...)
  {
    double saldo = 0.0; // Isso é uma variável
  }
}

Atributo:

class Conta
{
  private double saldo;  // Isso é um atributo

  private void button1_click(...)
  {
    (...)
  }
}

Propriedade:

class Conta
{
  public double Saldo { get; set; }  // Isso é uma propriedade

  private void button1_click(...)
  {
    (...)
  }
}

Dito isso, vamos à sua afirmação:

eu declarando a variavel saldo como public e colocando as propreties dela {private get; private set} seria a mesma coisa que declarar ela como privada, correto?

Resposta: não. Veja o código do que você sugere:

class Conta
{
  public double saldo;  // Isso é uma variável

  private void setSaldo(double saldo)
  {
    this.saldo = saldo;
  }

  private double getSaldo()
  {
    return saldo;
  }
}

Com esse código acima, eu posso acessar diretamente a variável saldo por ela ser pública. Eu posso ignorar os acessores (getter e setter).

Agora, se foi o caso de colocar os acessores de uma propriedade como private:

class Conta
{
  public double Saldo { private get; private set; } 

  private void button1_click(...)
  {
    (...)
  }
}

Nesse caso, eu não tenho acesso à propriedade fora da classe Conta, mesmo que ela seja pública, pois meus dois acessores são privados. Mas, ainda sim, o private não entra em desuso, muito pelo contrário.

Ajudou?

Ajudou sim, a minha dúvida é nesse caso:

class Conta
{
  public double Saldo { private get; private set; } 

  private void button1_click(...)
  {
    (...)
  }
}

no caso a variável saldo tem o mesmo comportamento de uma variável private, então eu posso ao invés de declarar variaveis privadas sempre declarar dessa forma, não?

solução!

Pode, vai se comportar da mesma forma. Mas não é a melhor escolha. Primeiro que você escreve muito mais em uma propriedade do que em uma variável.

Depois, entre criar variáveis privadas e criar propriedades, a variável privada é mais simples. Por mais que você só escreva get e set na sua propriedade, no seu binário serão escritos os métodos getters e setters para acessar a propriedade.

É, eu tava pensando isso mas queria saber se no fim das contas seria a "mesma coisa". Muito obrigado arthur, me ajudou bastante!

Olá.

Li toda explicação mas ao fim fiquei confuso com a definição dada para variável e para atributo. Nos exemplos percebi que a única diferença nas declarações exemplificadas são apenas o seu modificador de acesso. Quando disse ser um atributo ela estaria definida como Private e quando disse ser uma variável ela estaria definida como Atributo. O que distingue de fato um Atributo de uma Variável?

No mais, obrigado pela explicação dada ao nosso colega Igor, a mesma também me ajudou.