Определение, объявление, инициализация и присваивание в C#

Верны ли эти определения в 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;
}

Посмотрим, будут ли боги StackOverflow милостивы и Джон Скит появится в комментариях. Прочтите об этом: medium.com/c-programming/… Нет простого ответа «да» или «нет» на ваш вопрос, как это зависит. Более того, вы не можете обобщить это на любой язык, так как это всегда зависит. Если бы объявление всегда означало выделение памяти, вы могли бы вывести из строя свой компьютер без того, чтобы ваша программа вообще ничего не делала и не выполняла. Что было бы очень плохо.

Max 12.02.2023 22:49

Может быть, я должен написать это: Declaration = довести переменную до сведения компилятора

Bey Réda 12.02.2023 22:56

В С# это не совсем так, поскольку С# использует что-то, называемое компиляцией JIT. JIT означает «точно вовремя». Таким образом, в настоящее время компилируются и интерпретируются только те части вашего кода, которые необходимы для запуска вашей программы. Остальное загружается по мере необходимости. Так что нет, не все, что вы объявляете, всегда известно компилятору. См. этот пост для получения дополнительной информации о JIT.

Max 12.02.2023 23:01

Объявление int x; (без явного присваивания) автоматически присваивает значение default(int)x, то есть 0. У вас не может быть объявления без инициализации. И нет никакой гарантии, что вообще есть какая-то аллокация памяти — возможно, она и есть, но не всегда.

Enigmativity 13.02.2023 00:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
3
4
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Строго с точки зрения С#, вышеизложенное не совсем верно.

// 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;

Как я уже говорил выше, это просто задание.

Другие вопросы по теме