terça-feira, 29 de setembro de 2009

Funcionalidade de classe e membro static

Desde o último mês ando participando com grande frequência dos fóruns da msdn, e faz alguns dias que respondi uma dúvida da classe static. Porém ao responder as perguntas fui respondendo algumas coisas que não havia pensado sobre ela, como ocupação de memória, performance e velocidade.
Estou aqui para mostrar como foi a discussão porém como uma explicação.
O que é um membro static? Um menbro static é um membro de uma classe que terá o mesmo valor em todas as partes do código, por exemplo, considere uma classe

class MinhaClasse
{
public int Valor;
public static int ValorCompartilhado;
}

Qual a diferença entre Valor e ValorComparilhado? É o seguinte se você fizer:

MinhaClasse c = new MinhaClasse();
c.Valor = 2;

O 2 comente será visível para a instância c, agora caso você faça MinhaClasse.ValorCompartilhado = 2 o 2 será visível em todo o programa e em todas as partes que você faça int v = MinhaClasse.ValorCompartilhado a v será atribuido 2.

O que é uma classe static? Uma classe static só poderá conter membros static, assim no exemplo anterior teríamos que mudar int Valor para static int Valor.

Quando usar uma classe ou membro static? Primeiro vou responder a membors static, fica óbvio que se você precisa utilizar uma mesma instancia ou valor em todo o programa, imagine por exemplo uma instancia de uma conexão com o banco, você usará uma instancia dessa conexão como static. E classe? Classe static é muito utilizado para classes que contém apenas métodos ou então àquelas em que você após analisar verá que todos seus membros ficariam melhor como static, pois seus valores são compartilhados em todo o programa.

Discutiremos agora a parte de memória, desempenho e velocidade, para isso vamos levar em consideração estas duas classe:

public static class ClasseStatic
{
private static OutraClasse oc = new OutraClasse();
public static int Calculo = oc.Calcular();
public static string Nome = oc.RetornaNome();
}

public class ClasseNaoStatic
{
private OutraClasse oc = new OutraClasse();
public int Calculo = oc.Calcular();
public string Nome = oc.RetornaNome();
}

O que a OutraClasse faz não nos importa, analisaremos outras coisas.

Memória:
Considerando a classe static nós teremos:
OutraClasse = 1
int = 1
string = 1

Agora considerando a classe não static nós teremos os dados acima a cada nova instancia dela, fazendo então por exemplo:
ClasseNaoStatic ns1 = new ClasseNaoStatic();
ClasseNaoStatic ns2 = new ClasseNaoStatic();
Você terá:
OutraClasse = 2
int = 2
string = 2

Tendo assim um consumo menor de memória para a classe static.

Performance e velocidade:
Como chamamos dois métodos da classe OutraClasse para atribuir a Calculo e Nome e considerando uma velocidade para este método retornar, então teremos um tempo menor para a classe static, e levando a atribuição na pilha de métodos podemos ver uma melhor performance na classe static também.

Por que então não usar sempre static?
Imgine a seguinte situação, uma classe que controla quais usuários estão usando seu sistema, se for static e cada vez que um novo usuário entrar no sistema, você atribuir seu nome por exemplo ao membro static, você perderá os outros pois todo o programa agora usará o novo valor.

Conclusão:
Use static quando você ver a necessidade de seus dados terem o mesmo valor em todo o programa e uma mudança nele afete também todo o programa.

Para ver como foi a discussão no fórum segue o link:
http://social.msdn.microsoft.com/Forums/pt-BR/vscsharppt/thread/95bf6774-0d70-4cec-b1bd-20b9eeb4d030

2 comentários:

  1. Olá Murilo, valeu pelo artigo, exclareceu varias duvidas.

    Mas ainda estou com uma duvida, se puder me ajudar responda ai.

    Você disse que os valores de uma classe static são compartilhados em todo o programa. Mas quando tenho dois ou mais usuarios acessendo simultaneamente a mesma aplicação web no servidor com IIS este valores são compartilhados entre todos os usuarios ou cada um terá o sua instancia da classe?

    Se preferir eu iniciei uma discussão no fórum, segue o link http://social.msdn.microsoft.com/Forums/pt-BR/aspnetpt/thread/06da5e8a-d918-4257-9dc7-276acf893b1b

    Obrigado pela atenção.

    ResponderExcluir
  2. Ola,

    Aí você tem o seguinte caso. Você terá que armazenar essa classe estática em algum lugar, por exemplo armazenando em sessão. Como a sessão é única para cada usuário essa classe estática terá o mesmo valor em todo o programa, porém para aquele usuário.
    Respondendo a sua pergunta sobre micro1 e micro2, no seu caso o micro 2 estará com o valor nulo.

    Espero ter respondido.

    ResponderExcluir