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.

Foi útil?

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 #

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