The_Unknown_Member Ответов: 2

В .NET что делает значения полей по умолчанию?


Когда вы создаете класс с некоторыми полями, которые не имеют никакого значения, явно указанного разработчиком, они по умолчанию имеют значения по умолчанию (для Int32 это ноль). Поэтому мой вопрос заключается в том, как они получают дефолт? Делает ли компилятор C# что-то за кулисами в процессе компиляции? Или, может быть, это время выполнения?

Что я уже пробовал:

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

2 Ответов

Рейтинг:
9

Afzaal Ahmad Zeeshan

Помимо того, что Джон предложил в решении 1, пожалуйста, Также прочитайте о типах значений и ссылочных типах в контексте .NET framework. В этом контексте, если разработчик оставляет шаг инициализации и выполняет только объявление, присваивается значение по умолчанию — что очевидно. Я не эксперт, но я думаю, что это поведение имеет корни в C/C++, где 0 означает false, а нулевой указатель был (в очень старые времена) нулевым значением. Итак, чтобы убедиться, что все по умолчанию одинаково. Подобный этому,

int a = 0;

if(a) {
   // This should not be executed.
} else {
   // Should execute
}

Проверьте это здесь, Оболочка C++ [^]

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

Я хочу сказать, что каждый предмет должен иметь что-то. Если объект имеет ссылочный тип, то он будет null; который является значением по умолчанию для ссылочных типов, таких как string.

О, и C# также поддерживает a default и присвоение ценностей тоже. Подобный этому,
int a = default(int);

// Same as 
int a = new int();
int a = 0;
int a;

Это всего лишь личный выбор и предпочтения. :-)

Таблица значений по умолчанию (ссылка на C#) | Microsoft Docs[^]
Типы значений и ссылочные типы | Microsoft Docs[^]

О, И да, именно компилятор делает все это — если вы действительно не хотите копаться глубже в CLR и видеть IL C#. :смеяться:


BillWoodruff

+5

Afzaal Ahmad Zeeshan

Спасибо, Билл.

Рейтинг:
15

#realJSOP

Google - ваш друг:

c# object defaults - поиск в Google[^]


Maciej Los

О нет! Это не может быть правдой! :смеяться: