Странное поведение в C# для типов значений [дубликаты]

Я только что попробовал небольшой фрагмент кода, чтобы увидеть, как работает инициализация типа значения. Ниже приведен фрагмент кода

        public MainWindow()
        {
            InitializeComponent();

            int num;
            char alpha;
            //if (num == null)
            //{
            //    // this is null
            //}
            //else
            //{
            //    string value = num.ToString();
            //}

        }

Некоторые коды намеренно закомментированы для правильной сборки проекта. Предстоящая компиляция была

Use of unassigned local variable 'num'

Я знаю, что все переменные должны быть назначены перед использованием. Но когда я отладил это, я обнаружил, что num имеет значение 0. Если это значение по умолчанию инициализировано до 0, то почему нам нужно всегда присваивать какое-то значение перед его использованием.

Если бы это был тип nullable, я понимаю риск использования неназначенной переменной, которая будет через исключение.

Теперь предположим, что я хочу использовать нулевое значение num, которое уже доступно без какого-либо присвоения, почему мне обязательно инициализировать num?

Кто-то может сказать, что так работает .NET/C#. Но для этого должна быть какая-то веская причина. Не могли бы вы сказать эту причину?


person Narendra    schedule 19.06.2013    source источник


Ответы (3)


Переменные-члены будут инициализированы значением по умолчанию в соответствии с их типом! Вот их список.

public MyClass()
{
   int number; //will be initialized to zero
}

Однако локальные переменные (в функциях) не будут инициализированы компилятором значением по умолчанию, поэтому их нельзя использовать!

public void myFunction()
{
   int number; //will NOT be initialized to zero
}

И здесь ссылка на тот же вопрос в stackoverflow..

person Yami    schedule 19.06.2013

Если у вас есть поле, то вы можете оставить его неинициализированным, а затем использовать без проблем, потому что поле будет переменной памяти и оно будет автоматически инициализировано до 0 (во время инициализации). То же самое не работает с локальными переменными, так как компилятор может решить сохранить свое значение в регистре, и поэтому вам нужно неявно установить его значение по умолчанию, иначе оно будет иметь какое-то "случайное" значение. при первом использовании (осталось от предыдущего использования этого регистра), потому что регистры не очищаются автоматически.

Такое поведение характерно для C-языков, и я не понимаю, почему в C# оно должно быть другим.

person Sinatr    schedule 19.06.2013

Если вам нужно использовать весь диапазон int и вы хотите иметь дополнительную опцию, используйте int?, который является типом, допускающим значение NULL, все простые числа с ? on это тип, допускающий значение NULL, например, если вам нужно true, false и оба, можно использовать bool?.

person Thomas Andreè Wang    schedule 19.06.2013