É um novo objeto que é criado em um getter propriedade estática só criou uma só vez?
-
19-09-2019 - |
Pergunta
Estou criando uma classe auxiliar estática para serviços web que estou escrevendo. Eu estou batendo na API de Telligent e, portanto, a criação destas Level Up! Objetos "serviço" que me permitem fazer coisas com a plataforma. Por exemplo, eu estou criando um objeto MembershipSerice na minha classe auxiliar para que eu possa fazer coisas associação com o mesmo objeto. Na minha classe auxiliar Eu tenho uma propriedade com um getter que cria um novo um desses objetos:
private static MembershipService _MembershipService {
get {
return new MembershipService(path, usr, pwd);
}
}
E então eu tenho um método que retorna essa propriedade:
public MembershipService getMembershipService() {
return _MembershipService;
}
Isso quer dizer que uma vez que a propriedade é estática que o novo objeto criado no getter é criado apenas uma vez? Além disso, em termos de estilo de codificação, seria apenas melhor para fazer a propriedade pública e, portanto, o método seria desnecessário.
Ou ... seria melhor apenas criar o objeto como uma variável privada e devolvê-lo através do método público:
private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
public MembershipService getMembershipService() {
return _mbrSvc;
}
// then called elsewhere by me via:
MembershipService svc = MyHelperClass.getMembershipService();
Se você tem alguma opinião sobre o estilo de como eu configurá-lo para a sua eficiente e funciona bem, por favor me avise.
Solução
Isso quer dizer que uma vez que a propriedade é estática que o novo objeto criado no getter é criado apenas uma vez?
Não, porque você tem
new MembershipService(path, usr, pwd);
dentro do getter, independentemente de _MembershipService
ser declarado static
uma nova instância será criada em cada chamada. Todos os meios static
neste contexto é que você pode chamar o método sem ter uma instância da classe de definição.
Quanto ao comentar o estilo, bem, ele realmente depende do que você quer fazer. Você quer uma única instância? Se assim for, criar um _mbrSvc
variável de membro estático e retorno que desde o getter:
private static MembershipService _mbrSvc = new MembershipService(path, usr, pwd);
private static MembershipService _MembershipService {
get {
return _mbrSvc;
}
}
Caso contrário, como é está bem.
Outras dicas
Jason, Mark Apenas para sermos mais completos, que als depende da definição de MembershipService. Se MembershipService é uma classe, em seguida, o objeto é compartilhado entre os métodos de chamada. Se MembershipService é uma estrutura, uma cópia está sempre sendo criado. Apenas chamando-a de MembershipService-objeto não especifica a diferença, uma vez que em DotNet tudo é um objeto.
Se o objeto é caro para criar, considerar o uso de um padrão Singleton combinado com carregamento lento:
private static MembershipService _mbrSvc;
private static MembershipService _MembershipService {
get {
if(_mbrSvc == null)
{
_mbrSvc = new MembershipService(path, usr, pwd);
}
return _mbrSvc;
}
}
Toda vez que você usar new um novo objeto é criado.
Portanto, a primeira abordagem cria um novo cada vez que objeto a propriedade é acessado.
O que você está procurando é chamado de Singleton -. A sua segunda abordagem é uma possibilidade de implementá-lo em C #