none
Quando usar instancia e quando não usar??? RRS feed

  • Pergunta

  • Olá pessoal!!

    Tenho uma dúvida, estou desenvolvimento um pequeno sistema de cadastro de pedidos, estoque e etc...

    Tenho entendimento de OOP e sei que é possivel desenvolver qualquer sistema usando todos os conceitos de OOP e também sei que não é obrigatório o uso 100% do conceito.

    A minha dúvida é quando devo usar instanciar uma classe e quando usar metodos static por exemplo o que sei é quando se instancia um objeto ele ocupa memoria e já quando você cria metodos static não fica na memoria.

    Desde já agradeço.

    Abs


    Adriano_SP

    quinta-feira, 9 de fevereiro de 2012 13:16

Respostas

  • Olá Adriano_SP,

    Não é que classes estáticas não sejam instanciadas. Elas são, mas você, como programador, não tem controle sobre isto. A framework cria  uma instância da classe (em algum momento, não há garantia de quando isto ocorre) e na primeira vez que você invoca um membro estático é garantido que a classe estará inicializada. Todas as chamadas  (desde que seja um membro estático) referentes a esta classe são encaminhados para esta instância. Faça o seguinte teste, crie esta classe e acesse um membro da mesma (coloque um break point no construtor estático).

    public static class ClasseEstatica
    {
        static ClasseEstatica()
        {
            //
        }

        public static void FazAlgumaCoisa()
        {
            //
        }

        public static void FazOutraCoisa()
        {
            //
        }
    }

    Você vai notar que o construtor estático é chamado na primeira vez que você acessa um membro estático qualquer. Na cahamda seguinte o construtor não é chamado.

    Sobre quando usar e quando não usar, quanto mais você utiliza membros estáticos, menos orientada a objeto é sua aplicação. Lembre-se que objetos possuem estado, se você faz uso excessivo de membros estáticos você não pode (ou não deveria) manter estado, já que uma única instância irá atender a toda aplicação. Provavlemente você estará separando os dados do comportamento.

    Espero ter ajudado.


    Allan



    • Editado AllanFagner quinta-feira, 9 de fevereiro de 2012 14:28
    • Marcado como Resposta Adriano_SP domingo, 4 de março de 2012 00:12
    quinta-feira, 9 de fevereiro de 2012 14:13
  • Tudo Bem Adriano_SP

    os identificadores estaticos sao utilivados quando queremos que os nossos objectos referentes a esta classe partilhem todos alguma informacao invariavel como por exemplo

    a classe aluno todos possuem o mesmo professor

    numa empresa todos tem o meso patrao

    por ai veja este exemplo

    using System;

    class Aluno{

    private uint Idade;

    private string Nome;

    private static string Professor;

    public Aluno(string nome, uint idade)

    {

    Nome = nome;

    Idade = idade;

    }

    public static void NomeDoProf(string nome)

    {

    Professor = nome;

    }

    public void ApresentarDadosDoAluno()

    {

    Console.WriteLine("O aluno {0} tem {1} anos e o seu professor chama-se {2}", Nome, Idade, Professor);{

    class Geral

    static void Main()

    {

    Aluno A1 = new Aluno("Paulo", 16);

    Aluno A2 = new Aluno("Maria", 15);

    Aluno.NomeDoProf("Marcos");

    A1.ApresentarDadosDoAluno();

    A2.ApresentarDadosDoAluno();

    Console.ReadKey();

    }

    }     //Espero ter ajudado

    sábado, 3 de março de 2012 10:24

Todas as Respostas

  • Adriano não é assim que funciona: quando você cria métodos estáticos eles são criados durante a instânciação das DLL's do projeto, então elas já estão ocupando memória desde do ínicio. A utlização de classes estáticas deve ser feito com mutio cuidado principalmente se você for programas para web, veja uns pontos:

    Classes estáticas não guaram estado;

    Classes estáticas, em aplicações web, são pertencentes ao contexto da aplicação, ou seja eles são visiveis por qualquer usuário de qualquer session; 

    para mim, a utlização de classes estáticas somente deverá ser feitos para classes auxiliares (util) e Métodos Extensiveis


    Olavo Oliveira Neto
    http://olavooneto.wordpress.com
    Twitter @Olavooneto
    Se for útil marque como resposta e faça um Developer feliz :)

    quinta-feira, 9 de fevereiro de 2012 13:30
    Moderador
  • Simples: Voce usa metodo estático quando o mesmo nao depende estar em uma instancia para funcionar. 


    • Sugerido como Resposta Renato Coqueiro quinta-feira, 9 de fevereiro de 2012 13:32
    • Editado Renato Coqueiro quinta-feira, 9 de fevereiro de 2012 14:02
    • Não Sugerido como Resposta Renato Coqueiro sexta-feira, 24 de fevereiro de 2012 11:20
    quinta-feira, 9 de fevereiro de 2012 13:32
  • Olá Adriano_SP,

    Não é que classes estáticas não sejam instanciadas. Elas são, mas você, como programador, não tem controle sobre isto. A framework cria  uma instância da classe (em algum momento, não há garantia de quando isto ocorre) e na primeira vez que você invoca um membro estático é garantido que a classe estará inicializada. Todas as chamadas  (desde que seja um membro estático) referentes a esta classe são encaminhados para esta instância. Faça o seguinte teste, crie esta classe e acesse um membro da mesma (coloque um break point no construtor estático).

    public static class ClasseEstatica
    {
        static ClasseEstatica()
        {
            //
        }

        public static void FazAlgumaCoisa()
        {
            //
        }

        public static void FazOutraCoisa()
        {
            //
        }
    }

    Você vai notar que o construtor estático é chamado na primeira vez que você acessa um membro estático qualquer. Na cahamda seguinte o construtor não é chamado.

    Sobre quando usar e quando não usar, quanto mais você utiliza membros estáticos, menos orientada a objeto é sua aplicação. Lembre-se que objetos possuem estado, se você faz uso excessivo de membros estáticos você não pode (ou não deveria) manter estado, já que uma única instância irá atender a toda aplicação. Provavlemente você estará separando os dados do comportamento.

    Espero ter ajudado.


    Allan



    • Editado AllanFagner quinta-feira, 9 de fevereiro de 2012 14:28
    • Marcado como Resposta Adriano_SP domingo, 4 de março de 2012 00:12
    quinta-feira, 9 de fevereiro de 2012 14:13
  • Tudo Bem Adriano_SP

    os identificadores estaticos sao utilivados quando queremos que os nossos objectos referentes a esta classe partilhem todos alguma informacao invariavel como por exemplo

    a classe aluno todos possuem o mesmo professor

    numa empresa todos tem o meso patrao

    por ai veja este exemplo

    using System;

    class Aluno{

    private uint Idade;

    private string Nome;

    private static string Professor;

    public Aluno(string nome, uint idade)

    {

    Nome = nome;

    Idade = idade;

    }

    public static void NomeDoProf(string nome)

    {

    Professor = nome;

    }

    public void ApresentarDadosDoAluno()

    {

    Console.WriteLine("O aluno {0} tem {1} anos e o seu professor chama-se {2}", Nome, Idade, Professor);{

    class Geral

    static void Main()

    {

    Aluno A1 = new Aluno("Paulo", 16);

    Aluno A2 = new Aluno("Maria", 15);

    Aluno.NomeDoProf("Marcos");

    A1.ApresentarDadosDoAluno();

    A2.ApresentarDadosDoAluno();

    Console.ReadKey();

    }

    }     //Espero ter ajudado

    sábado, 3 de março de 2012 10:24
  • Obrigado á todos !!!

    Com certeza foram bastante esclarecedores as explicações.

    Abraços


    Adriano_SP

    domingo, 4 de março de 2012 00:10