2016-09-04 3 views
0

при экспериментировании с статическими переменными Я был поражен, узнав, почему статический результат «int» равен 0 (ноль) и нестатический результат для компиляции временной ошибки.C# несвязанные статические значения int до нуля

Рассмотрим случай 1

static int i; 
    static void Main() 
    { 
    Console.Write("Value of i = " + i); 
    Console.ReadKey(); 
    } 

выход

Value of i = 0 

Случай 2 с удалением статического

static void Main() 
    { 
    int i; 
    Console.Write("Value of i = " + i); 
    Console.ReadKey(); 
    } 

И выход за это приведет к компиляции ошибка времени

Error 1 Use of unassigned local variable 'i' 

вопрос здесь, как оба обстоятельства отличаются друг от друга. Первый результат - 0, а другой - ошибка компилятора.

+0

Ваш второй фрагмент не соответствует «определенному правилу присваивания» в C#. Правило, которое проверяет, что переменная всегда инициализируется. Но у него есть ограничения, он не может легко сказать, что там может быть код где-то еще, где-нибудь еще, который инициализирует статическую переменную. Слишком сложно сделать правильно. Он может работать только с локальными переменными, параметрами, объявленными с ключевым словом 'out', и полями типа struct, используемыми переменной экземпляра. Глава 5.3.2 в спецификации языка. В противном случае у вас есть твердая гарантия, что статические переменные всегда инициализируются до 0 или null. –

ответ

2

по определению языка C#, типы имеют «значения по умолчанию», которые им назначаются, если вы не назначаете что-то еще. числа имеют значение по умолчанию 0, boolean - false, ссылочные типы - null и structs - каждый член по типу.

+0

согласился! но что, если я удалю статику? – ViZ

+0

@ViZ ** поля ** (статические или нет) ** всегда ** инициализируются по соглашению. ** локальные переменные ** различаются и ** не инициализированы **, если вы не делаете. –

+0

@SirRufo, но как они отличаются с точки зрения распределения памяти? – ViZ

Смежные вопросы