В чем разница между «созданным» и «инициализированным»?

79

Я слышал эти два слова, используемые в учебниках Microsoft для VB.NET. В чем разница между этими двумя словами при использовании в отношении переменных?

Теги:
variables

11 ответов

107
Лучший ответ

Значение по отношению к ссылочным типам

Переменные в С# находятся в 1 из 2 групп. Типы значений или типы ссылок. Типы типа int и DateTime являются типами значений. Напротив, любой класс, который вы создаете, является ссылочным типом. Строки С# также являются ссылочным типом. Большинство вещей в платформе .NET являются ссылочными типами.

Части переменной

Существует имя переменной и ее значение. Две части.

Имя переменной - это то, что вы объявляете. Значение - это то, что вам присвоить.

Переменные инициализируются

Все переменные всегда задают начальное значение в точке, в которой объявлена ​​переменная. Таким образом, все переменные инициализированы.

Для типов значений, например int, компилятор даст им допустимое значение, если вы не сделаете это явно. int инициализировать до нуля по умолчанию, DateTime инициализировать до DateTime.MinValue по умолчанию.

Переменные ссылочного типа инициализировать для объекта, который вы ему даете. Компилятор не будет назначать объект (т.е. Действительное значение), если вы этого не сделаете. В этом случае значение null - ничего. Поэтому мы говорим, что ссылка инициализирована на null.

Объекты запускаются

Люди рождаются. Объекты создаются. Ребенок - это экземпляр человека, объект - это экземпляр некоторого класса.

Акт создания экземпляра класса называется экземпляром (Ta-Da!)

Итак, объявляйте, инициализируйте и создайте экземпляр, вот так

MyClass myClassyReference= new MyClass();

В приведенном выше случае неправильно говорить "... создание экземпляра объекта..."

Невыносимая легкость бытия

Имя и значение переменной ссылочного типа существует независимо. И я имею в виду независимость.

Конкретный объект может иметь или не иметь ссылки на него.

Конкретный объект может иметь много ссылок на него.

Заявленная ссылка может указывать или не указывать на объект.

  • 0
    Идеальное объяснение!
  • 0
    Если неправильно говорить: «... создание экземпляра объекта ...», что вы должны сказать? "... создание экземпляра объекта и присвоение ему ссылки ..."?
Показать ещё 2 комментария
37

Переменная инициализируется значением. Объект создается, когда для него выделяется память, и он был запущен.

Например, здесь есть переменная:

Dim obj as Object

Эта переменная не была инициализирована. Как только я присвою значение переменной obj, переменная будет инициализирована. Вот примеры инициализации:

obj = 1
obj = "foo"

Активация - это совсем другое дело, но связано с тем, что за инстанцированием обычно следует инициализация:

Dim obj As New Object()

В предыдущей строке кода переменная obj инициализируется ссылкой на новый Object, который был создан. Мы говорим, что новый Object был создан, потому что мы создали его новый экземпляр.

Теперь я считаю, что VB.NET делает это намного более запутанным, чем С#, потому что не ясно, что назначение происходит в коде выше. В С# гораздо яснее, что существует как экземпляр экземпляра, так и инициализация переменной:

Object obj = new Object();
  • 0
    @ Андрей объект obj = 1; это инициализация и объект obj = new object () / это создание и инициализация это то, что вы упомянули. Теперь я хочу спросить вас о двух вещах. 1. что это? объект obj; ? 2. была ли выделена память при использовании объекта obj; ?? или он выделяется, когда я инициализирую его этим объектом кода obj = 1; ?
  • 0
    Я бы сказал, что «объект obj» является объявлением, и нет, память еще не выделена. Или, по крайней мере, достаточно памяти для хранения значения «ноль». Фактическая память для переменной будет выделена на основе значения после ее инициализации.
14

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

Часто это более или менее то же самое. Это:

SqlConnection conn = new SqlConnection();

создает экземпляр объекта SqlConnection и инициализирует переменную conn, установив ее в этот экземпляр.

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

4

* Активация означает создание экземпляра для класса или объекта. Инициализация означает * инициировать один и тот же объект или класс для любых целей. **

3

Мгновенный означает, что экземпляр объекта был создан. Initiated означает, что этот же объект выполнил некоторую инициализацию.

2

Когда вы создаете экземпляр класса или объекта, вы создаете его новый экземпляр или выделяете память для "удержания". Инициализация этого объекта будет инструкцией, выполняемой во время создания экземпляра.

2

Активация - это когда вы создаете экземпляр класса. Этот экземпляр тогда является объектом, и вы можете установить его свойства или вызвать методы на нем (скажите ему делать что-то).

Инициирование - это когда вы устанавливаете набор начальных условий для чего-то. Это что-то может быть объектом, где вы говорите ему инициировать себя или просто переменную, которой вы присваиваете значение.

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

Различие заключается в том, что создание - это создание вещи, которая может делать вещи; инициирование - это материал, который делается.

1

См. документы Java: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

" Точка originOne= новая точка (23, 94);

Declaration: The code set in bold are all variable declarations that associate a variable name with an object type.
Instantiation: The new keyword is a Java operator that creates the object.
Initialization: The new operator is followed by a call to a constructor, which initializes the new object."
0

Мы видим это так. Для строки кода ниже:

var p = new Person();

Вышеприведенная строка может быть прочитана следующим образом:

  • Переменная p была инициализирована как класс person
  • Класс Person был создан в переменной p

Тема ссылки или контекста. Говоря в терминах переменной, мы используем слово initialize. Говоря в терминах класса/типа, мы используем слово экземпляр.

0

Другие объяснили разницу, поэтому я не буду вдаваться в подробности. Но бывают случаи, когда инстанцирование неправильно инициализирует объект. Когда вы создаете экземпляр объекта, вы также инициализируете его некоторыми данными. Класс/тип будет иметь логику инициализации, тогда как логика создания экземпляра обычно выполняется с помощью ключевого слова new (в основном, выделения памяти, копирования ссылок и т.д.). Но инстанцирование необязательно должно приводить к действительному состоянию для объектов, которое есть, когда мы можем сказать, что объект не инициализирован. Вот практический пример, где объект может быть создан, но не инициализирован (извините, например, на С#).

class P { string name = "Ralf"; }

WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null

GetUninitializedObject не вызывает конструктор для создания объекта там (но некоторая внутренняя магия).

Можно также утверждать, что типы значений не создаются, а только инициализируются, поскольку при выполнении new.. не требуется новое распределение, но до одного определения экземпляра.

0

Мгновенное действие относится к распределению памяти для создания экземпляра класса, тогда как инициализация означает присвоение имени этому экземпляру путем назначения имени переменной этому экземпляру.

Например: SqlConnection conn = new SqlConnection();

Здесь new - это ключевое слово, которое выделяет память для экземпляра, а conn - это имя переменной, назначенное для этого экземпляра.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню