Pergunta

Isso funciona:

class MyClass
{
    int a;

    public MyClass()
    {
        int b = a;
    }
}

Mas isso dá um erro do compilador ( "Uso de variável local não atribuído 'a'"):

class MyClass
{
    public MyClass()
    {
        int a;
        int b = a;
    }
}

Tanto quanto eu posso dizer isso acontece porque no primeiro exemplo, tecnicamente, o compilador não sabe que 'a' não é atribuída. Neste último exemplo, 'a' é definido localmente, e, portanto, é fácil de controlar.

Mas por que o último exemplo não trabalho?

Do not inteiros padrão para 0? Isto é algo que o compilador impõe para "melhores práticas". Ou existe outra razão?

Foi útil?

Solução

No primeiro exemplo é um campo . Campos padrão automaticamente para 0 / / null falsa. No segundo exemplo é uma variável . As variáveis ??são não inadimplentes, e deve ter "atribuição definitiva" antes de serem usados.

Essencialmente, ao criar um objeto (ou inicializar um struct) ele zeros a memória (ou no caso de um ctor struct não-padrão, força-o a manualmente initialize tudo). No entanto, as variáveis ??são tão comuns (em cada método) que não querem a sobrecarga de ter a zero a pilha o tempo todo. -Lo em vez obriga a indicar o valor inicial.

Outras dicas

Do not inteiros padrão para 0?

Eles fazem quando os membros estão dados de uma classe, mas não quando eles são uma variável local:. Variáveis ??locais precisam ser inicializados explicitamente antes de serem utilizadas, daí o erro do compilador

Quando você criar uma nova instância de uma classe toda a memória que as necessidades objeto é "zerado" ints estão definidas para 0 cordas são definidos como nulo etc. Isso é para evitar um monte de erros de memória estranhos e hacks que eram possível em C (++). Infelizmente, isso também tem um custo de processamento pequena, por isso quando você cria uma variável local a linguagem assume é que você irá definir o valor-se muito em breve e não se incomoda zerar-lo para diminuir o número total de instruções necessárias. Para compensar o risco do uso de memória unset Isto introduz o compilador verifica para garantir que um valor foi definido antes que ele irá permitir que você use a variável.

Isso pode ser porque variável declarada no nível de classe não pode ser atribuído valor ao mesmo âmbito (excepto quando declarar)

exemplo

class Test
{
   int a;

   a = 0; // this is not allowed at class level & hence a initialized to default
}

enquanto

class Test
{
   void test()
   {
     int a;
     int b = a;

     a = 20; // this is allowed
   }
}

De acordo com o meu conhecimento quando declarar uma variável na classe e criou um objeto, em seguida, o construtor padrão inicializa a variável e por isso não há necessidade de inicializar as variáveis ??de classe. Mas vindo para os métodos em sala de aula há nenhum construtor ou qualquer coisa para inicializar as variáveis ??de modo que não pode atribuir variáveis ??não inicializadas nos métodos.

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