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

Dúvida conceitual

Boa noite, professor.

Por qual motivo foram criadas as duas propriedades abaixo sendo uma pública e outra privada?

private UserManager _userManager; public UserManager UserManager

Os métodos get e set se referem ao _userManager que é private, mesmo sendo escritos após o UserManager sem o ponto e vírgula, correto?

  private UserManager<UsuarioAplicacao> _userManager;
        public UserManager<UsuarioAplicacao> UserManager
        {
            get
            {
                if (_userManager == null)
                {
                    var contextOwin = HttpContext.GetOwinContext();
                    _userManager = contextOwin.GetUserManager<UserManager<UsuarioAplicacao>>();
                }
                return _userManager;
            }

            set {
                _userManager = value;
            } 

        }
3 respostas
solução!

Fala, xará, bom dia.

Falando de conceitos, o que temos no código mencionado por você são dois membros de uma classe, sendo que um deles é um campo e o outro é uma propriedade.

Então existe apenas uma propriedade chamada UserManager, ok?

Uma propriedade representa uma característica vísivel para o mundo externo. Internamente seu valor é armazenado por um campo. Para escrever e ler valores desses campos usamos métodos de acesso, que são os famosos getters e setters.

Então para uma pessoa com propriedades Idade e Nome escreveríamos assim:

private int _idade;
public int Idade
{
  get { return _idade; }
  set { _idade = value; }
}

private string _nome;
public string Nome
{
  get { return _nome; }
  set { _nome = value; }
}

Mas repara que existe muito código repetido aí em cima, não acha? Por isso, a linguagem C# tem uma maneira bastante elegante de abreviar esse código todo. É o recurso chamado auto-implemented properties (maiores detalhes aqui).

Nosso código ficaria assim com o uso desse recurso:


public int Idade { get; set; }
public string Nome { get; set; }

Muito melhor né? Observe que agora o campo que armazena o valor da propriedade ficou escondido. Mesmo assim o campo continua exisitindo!!

Mas e quando precisamos incluir um código mais complexo na hora de acessar o campo que armazena o valor da propriedade?

Nesse caso abrimos mão desse recurso (auto-implemented properties) e voltamos para o esquema normal com campos explícitos.

Foi isso que aconteceu no código mencionado por você! Vamos revisar o código agora com os conceitos que discutimos aqui:

private UserManager _userManager; //esse é o campo
public UserManager UserManager //essa é a propriedade
{
//método de acesso para leitura
  get 
  {
    if (_userManager == null)
    {
        var contextOwin = HttpContext.GetOwinContext();
        _userManager = contextOwin.GetUserManager<UserManager<UsuarioAplicacao>>();
    }
    return _userManager;
  }
//método de acesso para escrita
    set { _userManager = value; }
}

Então, respondendo a sua pergunta, o motivo do código é porque a leitura da propriedade UserManager é mais complexa. No método de acesso get verificamos se o campo é nulo e caso seja verdade buscamos uma instância através do contexto Owin da aplicação.

Espero que tenha ajudado a esclarecer sua dúvida.

Continue estudando!!

Boa tarde, xará!

Explicadíssimo! Excelente didática e abordagem.

Sinceramente ainda não havia visto desta forma ou se vi não tinha reparado, geralmente só vejo como o exemplo citado "public int Idade { get; set; }".

Muito obrigado!

Valeu, Daniel, pelos elogios. É um reconhecimento pelo esforço e dedicação de nosso trabalho aqui na Alura.

Sempre que precisar pode enviar um tópico, ok?

Abraços!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software