Я чув ці два слова, які використовуються в підручниках Microsoft для VB.NET. Яка різниця між цими двома словами при використанні посилань на змінні?
Я чув ці два слова, які використовуються в підручниках Microsoft для VB.NET. Яка різниця між цими двома словами при використанні посилань на змінні?
Відповіді:
Змінні в C # входять в 1 з 2 груп. Типи значення або типи довідок . Типи як int
і DateTime
є значеннями типів. На відміну від цього, будь-який клас, який ви створюєте, є типовим типом. C # рядки також є еталонним типом. Більшість речей у .NET-рамках є посиланнями типами.
Існує назва змінної та її значення . Дві частини .
У змінному імені є те , що ви оголосити , що це буде. Значення є те , що ви призначити на нього.
Всім змінним завжди надається початкове значення в точці, де оголошується змінна . Таким чином, всі змінні ініціалізуються .
Для типів значень , наприклад, int
компілятор надасть їм дійсне значення, якщо ви не зробите це явно. int
«S форматувати до нуля за замовчуванням, DateTime
" s ініціалізації для DateTime.MinValue
за замовчуванням.
Змінні типу посилань ініціалізуються на об'єкт, який ви йому надаєте. Компілятор не призначить об'єкт (тобто дійсне значення), якщо ви цього не зробите. У цьому випадку значення null
- нічого. Тому ми кажемо, що посилання ініціалізується на нуль.
Люди народжуються. Об'єкти інстанціюються. Дитина - це екземпляр людини, об'єкт - екземпляр якогось класу.
Акт створення екземпляра класу називається інстанцією (Ta-Da!)
MyClass myClassyReference = new MyClass();
У вищесказаному неправильно сказати "... створення екземпляра об'єкта ..."
редагувати - надихнув обговоренням коментарів
Три чіткі речі відбуваються (вище) з використанням різної термінології, і термінологія не є взаємозамінною:
MyClass myClassyReference
new MyClass()
=
.Перевірка фактів:
Змінна типу посилання також називається просто "посиланням". "Змінна типу значення" не є посиланням.
Це: "objectA - це екземпляр об'єкта" абсолютно невірно. Якщо об'єктA був "екземпляром objectB", то він повинен бути таким, що objectA починає життя з типом objectB - незалежно від того, що це є - і поточним станом - яким би це не було. Що щодо створення об'єктів D, E та F у міні зміни objectB? Ні, ні! Це понятійний та технічний випадок, що "objectA є екземпляром класу". "Моменталізація" та "екземпляр" мають точне значення - об'єкт отримує тип, визначення та значення з класу.
MyClass myClassyReference = null
Як правило, ми не кажемо, що "змінна призначається до нуля", і ми ніколи не кажемо, що "змінна посилається на нуль"; ні, натомість ми говоримо "змінна є нульовою"; або "змінна нічого не посилається", або "посилання є нульовим"
Практичне застосування:
Я натискаю пальцем на ваш код і кажу: "Цей примірник має недійсне властивість. Можливо, тому цикл виходить з ладу. Ви повинні перевірити параметри під час інстанції". (тобто аргументи конструктора).
Я бачу це у вашому коді,
MyClass myClassyReference;
myClassyReference.DoSomething();
"Ви оголосили змінну, але ніколи не призначили її. Це null, тому вона нічого не посилається. Ось чому виклик методу кидає виняток."
завершити редагування
Нормативний тип ім'я і значення змінного існують незалежно. І я маю на увазі незалежний.
Примірник об'єкта може або не може мати посилання на нього.
Примірник об'єкта може бути багато посилань на нього.
Оголошено посилання може або не може бути направлений на об'єкт.
Мінлива инициализируется зі значенням. об'єкт конкретизується , коли пам'ять виділяється для нього , і це конструктор був бігти.
Наприклад, тут є змінна:
Dim obj as Object
Ця змінна не була ініціалізована . Після того, як я призначу obj
змінній значення, змінна буде ініціалізована. Ось приклади ініціалізації:
obj = 1
obj = "foo"
Моменталізація - це зовсім інша річ, але пов'язана з нею, оскільки за екземпляром зазвичай йде ініціалізація:
Dim obj As New Object()
У попередньому рядку коду, то obj
змінна ініціалізується з посиланням на новий , Object
який був екземпляр . Ми говоримо, що нове Object
було створено миттєво, тому що ми створили його новий екземпляр.
Тепер я вважаю, що VB.NET робить це набагато більш заплутаним, ніж C #, оскільки не ясно, що призначення відбувається у наведеному вище коді. У C # набагато зрозуміліше, що існує як інстанція екземпляра, так і ініціалізація змінної:
Object obj = new Object();
Для того, щоб ініціалізувати що - то , щоб встановити його в початкове значення. Щоб створити екземпляр чого - то, щоб створити екземпляр.
Часто це більш-менш те саме. Це:
SqlConnection conn = new SqlConnection();
інстанцірует на SqlConnection
об'єкт і ініціалізує на conn
змінну, встановивши його в цьому випадку.
Оскільки конструктор об'єкта також встановлює властивості об'єкта за замовчуванням, часто правильно сказати, що інстанціювання об'єкта ініціалізує його. (Оманливий, якщо об’єкт відкриває метод, який потрібно експлікаційно викликати, щоб ініціалізувати його після його ініціації, як це буває.)
Миттєвий означає, що створено екземпляр об'єкта. Ініційований означає, що той самий об’єкт здійснив певну ініціалізацію.
Коли ви створюєте інстанціювання класу або об'єкта, ви створюєте новий екземпляр його або виділяєте пам'ять для його "утримання". Ініціалізацією цього об'єкта були б інструкції, які виконуються під час інстанції.
Моменталізація - це коли ви створюєте екземпляр класу. Тоді цей екземпляр є об'єктом, і ви можете встановити його властивості або викликати на ньому методи (сказати йому робити речі).
Ініціація - це коли ти встановлюєш набір початкових умов для чогось. Це може бути об'єктом, де ви говорите йому, щоб він ініціював себе, або просто змінною, якій ви присвоюєте значення.
Об'єкт може ініціалізувати деякі інші речі або навіть інстанціювати інші об'єкти як частину його ініціації.
Різниця полягає в тому, що примірник - це створення речі, яка може робити речі; посвячення - це щось, що робиться.
Дивіться документи Java: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html
" Точка початкуOne = нова точка (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."
Ми можемо бачити це таким чином. Для рядка коду нижче:
var p = new Person();
Вищенаведений рядок можна прочитати наступними двома способами:
Тема посилання чи контекст має значення. Коли ми говоримо з точки зору змінної , ми використовуємо слово ініціалізація . Коли ми говоримо з точки зору класу / типу , ми використовуємо слово instantiate .
Імпульс відноситься до розподілу пам'яті для створення екземпляра класу, тоді як ініціалізація стосується іменування цього екземпляра шляхом присвоєння імені змінної цьому екземпляру.
Наприклад: SqlConnection conn = new SqlConnection();
Ось new
ключове слово, яке виділяє пам'ять для екземпляра, і conn
це ім'я змінної, призначене для цього примірника.
Інші пояснили різницю, тому я не хочу вникати в деталі. Але бувають випадки, коли інстанція не належним чином ініціалізує об'єкт. Коли ви створюєте екземпляр об'єкта, ви також ініціалізуєте його з деякими даними. Клас / тип матиме логіку ініціалізації, тоді як логіка інстанції зазвичай виконується за допомогою new
ключового слова (в основному розподіл пам'яті, копіювання довідок тощо). Але екземпляри не обов'язково повинні приводити до дійсного стану для об'єктів, коли ми можемо сказати, що об'єкт неініціалізований . Ось практичний приклад, коли об’єкт можна інстанціювати, але не ініціалізувати (вибачте, наприклад, у C #).
class P { string name = "Ralf"; }
WriteLine(new P().name); // "Ralf";
WriteLine((FormatterServices.GetUninitializedObject(typeof(P)) as P).name); // null
GetUninitializedObject
не закликає конструктор інстанціювати об’єкт там (але якусь внутрішню магію).
Можна також стверджувати, що типи значень не є ініціалізованими, а лише ініціалізовані, оскільки це не потребує нового розподілу, коли ви це робите, new..
але це залежить від власного визначення інстанції.