В чем разница между "экземплярами" и "инициализированными"?
===========================================================

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

 

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

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

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

  Есть имя переменной и ее значение. **Две части**.

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

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

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

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

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

 ###  Объекты создаются

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

  Акт создания экземпляра класса называется **инстанцированием** (Та-Да!)

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

 
```
MyClass myClassyReference = new MyClass();

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

 

---

 редактировать - вдохновленный обсуждением комментариев

  Три отличных вещи происходят (выше), используя различную терминологию, и эта терминология не взаимозаменяема:

 1. `MyClass myClassyReference` переменная объявлена - `MyClass myClassyReference`
2. Объект создается (... из/из данного класса, подразумевается) - `new MyClass()`
3. Объект назначен переменной. `=`

 Повторяя факты:

 1. Переменная ссылочного типа также называется просто "ссылкой". "Переменная типа значения" не является ссылкой.
2. Это: "objectA является экземпляром объекта" глубоко неправильно. Если objectA был "экземпляром objectB", то это значит, что objectA начинает жизнь с типом objectB - каким бы он ни был - и текущим состоянием - каким бы он ни был. Как насчет создания объектов D, E и F при изменении объекта B? Нет, нет! Это концептуальный и технический случай: "objectA является экземпляром класса". "Instantiation" и "instance of" имеют точное значение - объект получает свой тип, определения и значения из класса.
3. `MyClass myClassyReference = null` Обычно мы не говорим "переменная назначена на ноль", и мы никогда не говорим "переменная ссылается на ноль", вместо этого мы говорим "переменная равна нулю"; или "переменная не ссылается ни на что", или "ссылка является нулевой"

 Практическое применение:

 * Я ткну пальцем в ваш код и говорю: "Этот экземпляр имеет недопустимое свойство. Возможно, именно поэтому цикл завершается неудачей. Вам нужно проверить параметры во время создания экземпляра". (т.е. аргументы конструктора).
* Я вижу это в вашем коде,

 
```
MyClass myClassyReference;
myClassyReference.DoSomething();

```
  "Вы объявили переменную, но никогда не присваивали ее. Она равна нулю, поэтому она не ссылается ни на что. Поэтому вызов метода вызывает исключение".

 конец редактирования

 

---

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

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

  Созданный объект может иметь или не иметь ссылку на него.

  Созданный объект может иметь много ссылок на него.

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

 

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

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

```
Dim obj as Object

```

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

```
obj = 1
obj = "foo"

```

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

```
Dim obj As New Object()

```

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

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

```
Object obj = new Object();

```
 

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

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

```
SqlConnection conn = new SqlConnection();

```

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

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

 

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

 

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

 

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

 

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

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

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

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

 

См. документы 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."

```
 

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

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

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

 

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

```
class P { string name = "Ralf"; }

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

```

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

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

 

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

```
var p = new Person();

```

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

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

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