Верны ли эти определения в C#?
static void Main()
{
// Declaration = memory allocation
int x;
// Initialization = set initial value
x = 0;
// Definition = declaration and initialization
int y = 0;
// Assignement = set a new value
y = 1;
}
Может быть, я должен написать это: Declaration = довести переменную до сведения компилятора
В С# это не совсем так, поскольку С# использует что-то, называемое компиляцией JIT. JIT означает «точно вовремя». Таким образом, в настоящее время компилируются и интерпретируются только те части вашего кода, которые необходимы для запуска вашей программы. Остальное загружается по мере необходимости. Так что нет, не все, что вы объявляете, всегда известно компилятору. См. этот пост для получения дополнительной информации о JIT.
Объявление int x;
(без явного присваивания) автоматически присваивает значение default(int)
x
, то есть 0
. У вас не может быть объявления без инициализации. И нет никакой гарантии, что вообще есть какая-то аллокация памяти — возможно, она и есть, но не всегда.
Строго с точки зрения С#, вышеизложенное не совсем верно.
// Declaration = memory allocation int x;
Для типов со семантикой значений вышеизложенное верно, но для типов со ссылочной семантикой это не так, потому что не происходит распределения. Разница в том, что выделение памяти происходит с помощью ключевого слова new
со ссылками. Что касается типов значений, они хранятся в стеке, и стек предварительно выделяется размером 4 МБ при запуске процесса .NET.
Примером может быть
string x;
приведенный выше оператор только сообщает компилятору, что такое x
, и ничего не происходит в программе, когда она компилируется.
// Initialization = set initial value x = 0;
Здесь снова я бы сказал, что вышеприведенное - это просто присваивание, а не обязательно начальное значение, поскольку ничто не мешает вам написать
x = 1;
x = 2;
Между этими двумя присваиваниями нет никакой разницы: одно из них является начальным значением, а другое — нет. Это потому, что мы не знаем, было ли где-то ранее присвоено значение x
.
// Definition = declaration and initialization int y = 0;
Я бы назвал это просто инициализацией, так как здесь наверняка значение присваивается в первый раз.
// Assignement = set a new value y = 1;
Как я уже говорил выше, это просто задание.
Посмотрим, будут ли боги StackOverflow милостивы и Джон Скит появится в комментариях. Прочтите об этом: medium.com/c-programming/… Нет простого ответа «да» или «нет» на ваш вопрос, как это зависит. Более того, вы не можете обобщить это на любой язык, так как это всегда зависит. Если бы объявление всегда означало выделение памяти, вы могли бы вывести из строя свой компьютер без того, чтобы ваша программа вообще ничего не делала и не выполняла. Что было бы очень плохо.