Я слышал, как эти два слова используются в руководствах Microsoft по VB.NET. В чем разница между этими двумя словами, когда они используются в отношении переменных?
Переменные в C # находятся в одной из двух групп. Типы значений или ссылочные типы. Такие типы, как int
и DateTime
являются типами значений . Напротив, любой создаваемый вами класс является ссылочным типом. Строки C # также являются ссылочным типом. Большинство вещей в .NET framework являются ссылочными типами.
Есть имя переменной и ее значение . Две части .
В переменном имени является то , что вы объявить , что это будет. Значение является то , что вы назначить на него.
Все переменные всегда получают начальное значение в момент объявления переменной . Таким образом инициализируются все переменные .
Для типов значений , например, int
компилятор предоставит им допустимое значение, если вы не сделаете этого явно. int
«s инициализировать до нуля по умолчанию, DateTime
» s инициализации для DateTime.MinValue
по умолчанию.
Переменные ссылочного типа инициализируются для объекта, который вы им передаете. Если вы этого не сделаете, компилятор не назначит объект (т.е. допустимое значение). В данном случае значение null
- ничего. Итак, мы говорим, что ссылка инициализируется нулевым значением.
Люди рождаются. Объекты создаются. Младенец - это экземпляр Человека, объект - это экземпляр некоторого Класса.
Акт создания экземпляра класса называется инстанциацией (Ta-Da!)
MyClass myClassyReference = new MyClass();
Выше неправильно говорить «... создание экземпляра объекта ...»
edit - вдохновлено обсуждением комментариев
Происходят три разные вещи (см. Выше) с использованием различной терминологии, и эта терминология не является взаимозаменяемой:
MyClass myClassyReference
new MyClass()
=
.Повторяя факты:
Переменная ссылочного типа также называется просто «ссылкой». «Переменная типа значения» не является ссылкой.
Это: «objectA - это экземпляр объекта» в корне неверно. Если objectA был «экземпляром objectB», то должно быть, что objectA начинает жизнь с типом objectB - каким бы он ни был - и текущим состоянием - чем бы он ни был. Как насчет создания объектов D, E и F при изменении объекта B? Нет, нет! Это концептуальный и технический случай, когда «objectA является экземпляром класса». «Создание» и «экземпляр» имеют точное значение - объект получает свой тип, определения и значения из класса.
MyClass myClassyReference = null
Обычно мы не говорим «переменной присвоено значение NULL» и никогда не говорим «переменная ссылается на NULL». Нет. Вместо этого мы говорим «переменная имеет значение NULL»; или «переменная ни на что не ссылается», или «ссылка пуста»
Практическое применение:
Я нажимаю пальцем на ваш код и говорю: «У этого экземпляра недопустимое свойство. Может быть, поэтому цикл не работает. Вы должны проверить параметры во время создания экземпляра». (т.е. аргументы конструктора).
Я вижу это в вашем коде,
MyClass myClassyReference;
myClassyReference.DoSomething();
«Вы объявили переменную, но не присвоили ее. Она пуста, поэтому ни на что не ссылается. Вот почему вызов метода вызывает исключение».
конец править
A типа базового имя и значение переменного существуют независимо. И я имею в виду независимый.
Созданный экземпляр объекта может иметь ссылку на него, а может и не иметь.
Экземпляр объекта может быть много ссылок на него.
Объявлено ссылка может или не может быть направлен на объект.
Переменная инициализируется со значением. Объект конкретизируется , когда память выделяется для него , и это конструктор был бежать.
Например, вот переменная:
Эта переменная не была инициализирована . Как только я присвою значение
obj
переменной, она будет инициализирована. Вот примеры инициализации:Создание экземпляра - это совсем другое дело, но оно связано, поскольку создание экземпляра обычно сопровождается инициализацией:
В предыдущей строке кода, то
obj
переменная инициализируется со ссылкой на новый ,Object
который был экземпляр . Мы говорим, что новыйObject
экземпляр был создан, потому что мы создали его новый экземпляр.Теперь я считаю, что VB.NET делает это намного более запутанным, чем C #, потому что неясно, происходит ли присвоение в приведенном выше коде. В C # гораздо яснее, что существует как создание экземпляра, так и инициализация переменной:
источник
Чтобы инициализировать что-либо, нужно установить его начальное значение. Чтобы создать что-то, нужно создать его экземпляр.
Часто это более или менее одно и то же. Это:
инстанцирует на
SqlConnection
объект и инициализирует наconn
переменную, установив его в этом случае.Поскольку конструктор объекта также устанавливает для свойств объекта значения по умолчанию, часто правильно сказать, что создание экземпляра объекта инициализирует его. (Вводит в заблуждение, если объект предоставляет метод, который вы должны явно вызвать для его инициализации после его создания, как это иногда бывает.)
источник
* Создание означает создание экземпляра для класса или объекта. Инициализация означает * инициирование того же объекта или класса для любой цели. **
источник
Instantiated означает, что экземпляр объекта был создан. Инициировано означает, что тот же объект выполнил некоторую инициализацию.
источник
Когда вы создаете экземпляр класса или объекта, вы создаете его новый экземпляр или выделяете память для его «хранения». Инициализация этого объекта будет инструкциями, которые выполняются во время создания экземпляра.
источник
Создание экземпляра - это создание экземпляра класса. Тогда этот экземпляр является объектом, и вы можете установить его свойства или вызвать для него методы (указать ему что-то делать).
Инициация - это когда вы устанавливаете для чего-то набор начальных условий. Это что-то может быть объектом, в котором вы говорите, что он запускается сам, или просто переменной, которой вы присваиваете значение.
Объект может инициализировать некоторые другие вещи или даже создавать экземпляры других объектов как часть своей инициации.
Разница в том, что создание экземпляра - это создание вещи, которая может что-то делать; инициация - это то, что делается.
источник
См. Документы по Java: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
" Point originOne = новая точка (23, 94);
источник
Мы можем видеть это так. Для строки кода ниже:
Вышеупомянутую строку можно прочитать двумя способами:
Тема ссылки или контекст имеет значение. Говоря о переменных , мы используем слово инициализировать . Говоря о классе / типе , мы используем слово instantiate .
источник
Создание относится к выделению памяти для создания экземпляра класса, тогда как инициализация относится к именованию этого экземпляра путем присвоения имени переменной этому экземпляру.
Например:
SqlConnection conn = new SqlConnection();
Вот
new
ключевое слово, которое выделяет память для экземпляра иconn
является именем переменной, присвоенным этому экземпляру.источник
Другие объяснили разницу, поэтому я не буду вдаваться в подробности. Но бывают случаи, когда при создании экземпляра объект не инициализируется должным образом. Когда вы создаете экземпляр объекта, вы также инициализируете его некоторыми данными. Класс / тип будет иметь логику инициализации, тогда как логика создания экземпляра обычно выполняется с помощью
new
ключевого слова (в основном выделение памяти, копирование ссылок и т. Д.). Но создание экземпляра не обязательно должно приводить к действительному состоянию для объектов, когда мы можем сказать, что объект не инициализирован . Вот практический пример, когда объект может быть создан, но не инициализирован (извините, например, в C #).GetUninitializedObject
не вызывает конструктор для создания экземпляра объекта там (но некоторая внутренняя магия).Можно также утверждать, что типы значений не создаются, а только инициализируются, поскольку при этом не требуется новое распределение,
new..
но это зависит от определения создания экземпляра.источник