none
2 Construtores Default RRS feed

  • Pergunta

  • Boa noite,

    Um caso me intrigou agora!!! gostaria de saber pq o C# aceita 2 construtores default, um com static e outro sem:

        public class Loja
        {
            public Loja()
            {
            }
    
            static Loja()
            {
                Console.WriteLine("Default 2");
            }
       }
    e se eu tirar o static do meu segundo construtor ele me dá erro!

    No caso ele não esta recoonhecendo como um método static, pois é acionado qdo instancio um objeto da minha classe pessoa.

    Dai me veio outra questao na cabeça! Qdo utilizo uma classe como estatica?

    Entao tenho duas questoes:

    - Pq é aceito 2 construtores default contanto que um seja static?
    - Qdo utilizamos classes estaticas? Pode me dar um exemplo?

    Obrigado!

    "O pior naufrágio é daquele que não saiu do porto"
    segunda-feira, 11 de maio de 2009 02:53

Respostas

  • Michel,

        este  "static Class1"  não é um construtor. É um inicializador estático.

        Ele é executado apenas uma vez por aplicação. É executado qdo a classe é carregada (  Carregada != Instanciada )

        Quando a DLL é carregada,as classes são tb. Os inicializadores são executados.

        Quando a classe é instanciada, é execudato apenas o construtor (para cada instância).

    Abs
    Bruno Gallego - Se este poste foi útil, por favor, classifique
    MCP - MCTS - MCDBA - MCPD.NET
    segunda-feira, 11 de maio de 2009 18:19
  • Sim, é isso.

    Veja a classe abaixo q fiz. Criei um projeto Consle aplication para mostrar o exemplo:

    Antes de entrar no "static void main", o inicializador já é executado.

    Na primeira linha "ReadKey" , já é printado na tela o texto "Inicializador".

    Depois apresento o uso dos construtores, para mostrar que depois o inicializador não é + executado.

    Como disse inicializador é só 1 vez. Construtor é para cada "construção" de objeto.

    Este inicializador é + para inicializar variáveis estáticas, ou alguma outra coisa no contexto de aplicação que deva ser executado apenas uma vez.
    Por exemplo: Carregar a configuração de log  ( O Framework log4net por exemplo precisa ser chamado o método Configure apenas 1 vez por aplicação  )


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
        class Program
        {

            static void Main(string[] args)
            {
                Console.ReadKey();

                Program p = new Program();

                Console.ReadKey();

                p = new Program();

                Console.ReadKey();
            }

            private static int contador;

            static Program()
            {
                contador = 0;
                Console.WriteLine("Inicializador");
            }

            public Program()
            {
                contador ++;
                Console.WriteLine("Construtor " + contador);
            }


        }
    }


    Abs

    Bruno Gallego - Se este poste foi útil, por favor, classifique
    MCP - MCTS - MCDBA - MCPD.NET
    segunda-feira, 11 de maio de 2009 23:06
  • Michel,

    Complementando -> http://www.csharphelp.com/archives3/archive565.html

    Vale a pena dar uma olhada .


    Abraço,
    Nelson Borges - Analista de Sistemas
    terça-feira, 12 de maio de 2009 03:12

Todas as Respostas

  • Leonardo,

    Mas continuo sem entender, pq uma classe estática pode ter somente um construtor, e este tendo que ser obrigatoriamente statico tbm, que nem no trecho abaixo:

        static class Class1
        {
            static Class1()
            {
                Console.WriteLine("Classe Static");
            }
        }
    Ele não pode ser public como vc citou acima, uma classe static so pode ter 1 construtor, agora uma classe sem o modificador de acesso static , pode ter 2 construtores, 1 com static e outro sem static conforme o caso abaixo:

        class Class1
        {
            public Class1()
            {
                Console.WriteLine("Classe");
            }
        }
    Entendeu em qual caso tenho duvida? Qdo uma classe não é estatica ela pode ter um construtor static e outro não, pq isso?
    "O pior naufrágio é daquele que não saiu do porto"
    segunda-feira, 11 de maio de 2009 15:42
  • Michel,

        este  "static Class1"  não é um construtor. É um inicializador estático.

        Ele é executado apenas uma vez por aplicação. É executado qdo a classe é carregada (  Carregada != Instanciada )

        Quando a DLL é carregada,as classes são tb. Os inicializadores são executados.

        Quando a classe é instanciada, é execudato apenas o construtor (para cada instância).

    Abs
    Bruno Gallego - Se este poste foi útil, por favor, classifique
    MCP - MCTS - MCDBA - MCPD.NET
    segunda-feira, 11 de maio de 2009 18:19
  • Certo, agora acho que peguei o espirito da coisa Bruno!

    Então se eu tiver o codigo abaixo:
        class Class1
    {
    public Class1()
    {
    Console.WriteLine("Construtor Padrão");
    }

    static Class1()
    {
    Console.WriteLine("Construtor Estático");
    }
    }
    Quer dizer que eu tenho uma classe, que possui 1 construtor e o outro não é um construtor, é inicializador estatico? É isso então?

    obs: a parte dele ser executado qdo a dll é carregada/utilizada ja entendi.
    "O pior naufrágio é daquele que não saiu do porto"
    segunda-feira, 11 de maio de 2009 20:57
  • Sim, é isso.

    Veja a classe abaixo q fiz. Criei um projeto Consle aplication para mostrar o exemplo:

    Antes de entrar no "static void main", o inicializador já é executado.

    Na primeira linha "ReadKey" , já é printado na tela o texto "Inicializador".

    Depois apresento o uso dos construtores, para mostrar que depois o inicializador não é + executado.

    Como disse inicializador é só 1 vez. Construtor é para cada "construção" de objeto.

    Este inicializador é + para inicializar variáveis estáticas, ou alguma outra coisa no contexto de aplicação que deva ser executado apenas uma vez.
    Por exemplo: Carregar a configuração de log  ( O Framework log4net por exemplo precisa ser chamado o método Configure apenas 1 vez por aplicação  )


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;

    namespace ConsoleApplication1
    {
        class Program
        {

            static void Main(string[] args)
            {
                Console.ReadKey();

                Program p = new Program();

                Console.ReadKey();

                p = new Program();

                Console.ReadKey();
            }

            private static int contador;

            static Program()
            {
                contador = 0;
                Console.WriteLine("Inicializador");
            }

            public Program()
            {
                contador ++;
                Console.WriteLine("Construtor " + contador);
            }


        }
    }


    Abs

    Bruno Gallego - Se este poste foi útil, por favor, classifique
    MCP - MCTS - MCDBA - MCPD.NET
    segunda-feira, 11 de maio de 2009 23:06
  • Ah!! Ok, agora entendi mesmo!

    Obrigado pela ajuda!
    "O pior naufrágio é daquele que não saiu do porto"
    segunda-feira, 11 de maio de 2009 23:40
  • Michel,

    Complementando -> http://www.csharphelp.com/archives3/archive565.html

    Vale a pena dar uma olhada .


    Abraço,
    Nelson Borges - Analista de Sistemas
    terça-feira, 12 de maio de 2009 03:12
  • Otimo!

    Muito obrigado Nelson!
    "O pior naufrágio é daquele que não saiu do porto"
    terça-feira, 12 de maio de 2009 15:55