Jaka jest różnica między „utworzony” a „zainicjowany”?

105

Słyszałem te dwa słowa używane w tutorialach Microsoft dla VB.NET. Jaka jest różnica między tymi dwoma słowami w odniesieniu do zmiennych?

l --''''''--------- '' '' '' '' '' ''
źródło

Odpowiedzi:

142

Wartość w porównaniu z typami odniesień

Zmienne w C # są w 1 z 2 grup. Typy wartości lub typy odwołań . Typy takie jak inti DateTimesą typami wartości . W przeciwieństwie do tego każda utworzona klasa jest typem referencyjnym . Ciągi C # są również typem referencyjnym . Większość rzeczy w .NET Framework to typy referencyjne .

Części zmiennej

Jest nazwa zmiennej i jej wartość . Dwie części .

Zmienna jest nazwa jest to, co deklarują , że jest. Wartość jest co przypisać do niego.

Zmienne są inicjalizowane

Wszystkim zmiennym zawsze przypisywana jest wartość początkowa w momencie deklarowania zmiennej . W ten sposób wszystkie zmienne są inicjalizowane .

W przypadku typów wartości , takich jak intkompilator, poda im prawidłową wartość, jeśli nie zrobisz tego jawnie. int„s zainicjować zero domyślnie DateTime” s zainicjować aby DateTime.MinValuedomyślnie.

Zmienne typu referencyjnego są inicjalizowane w podanym obiekcie. Kompilator nie przypisze obiektu (tj. Prawidłowej wartości), jeśli tego nie zrobisz. W tym przypadku wartością jest null- nic. Więc mówimy, że odwołanie jest inicjalizowane na null.

Obiekty są tworzone

Rodzą się ludzie. Obiekty są tworzone. Dziecko jest przykładem Człowieka, obiekt jest przykładem jakiejś Klasy.

Czynność tworzenia instancji klasy nazywana jest instancją (Ta-Da!)

Więc deklaruj , inicjalizuj i twórz instancję łączą się w ten sposób

MyClass myClassyReference = new MyClass();

W powyższym błędem jest powiedzenie „… tworzenie instancji obiektu …”


edycja - inspirowana dyskusją w komentarzach

Trzy różne rzeczy mają miejsce (powyżej) przy użyciu odrębnej terminologii i terminologia ta nie jest wymienna:

  1. Zadeklarowano zmienną referencyjną - MyClass myClassyReference
  2. Tworzony jest obiekt (... z / danej klasy , domniemany) -new MyClass()
  3. Obiekt zostaje przypisany do zmiennej. =.

Ponowne przedstawienie faktów:

  1. Zmienna typu referencyjnego jest również nazywana po prostu „referencją”. „Zmienna typu wartości” nie jest odniesieniem.

  2. To: „obiektA jest instancją obiektu” jest głęboko błędne. Jeśli obiekt A był „instancją obiektu B”, to musi być tak, że obiekt A zaczyna życie z typem obiektu B - cokolwiek to jest - i aktualnym stanem - cokolwiek to jest. A co z tworzeniem obiektów D, E i F, gdy obiektB się zmienia? Nie, nie! W przypadku koncepcyjnym i technicznym „obiektA jest instancją klasy”. „Instancja” i „instancja” mają dokładne znaczenie - obiekt pobiera swój typ, definicje i wartości z klasy.

  3. MyClass myClassyReference = null Generalnie nie mówimy „zmienna jest przypisana do wartości null” i nigdy nie mówimy „zmienna odwołuje się do wartości null”, zamiast tego mówimy „zmienna ma wartość null”; lub „zmienna do niczego się nie odwołuje” lub „odwołanie jest puste”

Praktyczne zastosowanie:

  • Wtykam palec w Twój kod i mówię „Ta instancja ma nieprawidłową właściwość. Może dlatego pętla zawodzi. Podczas tworzenia instancji musisz sprawdzić poprawność parametrów”. (tj. argumenty konstruktora).

  • Widzę to w twoim kodzie,

    MyClass myClassyReference;
    myClassyReference.DoSomething();

    „Zadeklarowałeś zmienną, ale nigdy jej nie przypisałeś. Jest pusta, więc do niczego się nie odwołuje. Dlatego wywołanie metody zgłasza wyjątek”.

koniec edycji


Nieznośna lekkość bytu

A oznaczenie typu nazwa zmiennej i wartość istnieje niezależnie. I mam na myśli niezależność.

Instancja obiektu może lub nie może mieć odniesienie do niego.

Instancja obiektu może mieć wiele odniesień do niej.

Oświadczył odniesienia może lub nie może być wskazując na obiekt.

radarbob
źródło
Doskonałe wyjaśnienie!
M. Fawad Surosh
Jeśli powiedzenie: „… tworzenie instancji obiektu…” jest błędne, co należy powiedzieć? „… tworzenie instancji obiektu i przypisywanie do niego odniesienia…”?
Aaron Dake,
A co z: „… utworzeniem instancji obiektu i zainicjowaniem zmiennej jako referencji do niego”? Obejmuje to oba słowa i wydaje się, że wszystko to przeliteruje - aczkolwiek w dość długi sposób. Co myślisz?
Aaron Dake,
... co powinieneś powiedzieć? Powiedz: „tworzenie instancji klasy”, a nie „… obiektu”. A „tworzenie instancji zmiennej w odniesieniu do niej” jest podwójną rozmową i jest błędne z dwóch powodów: (1) tworzone są tylko obiekty. (2) Zmienna „wskazująca” obiekt jest zmienną odniesienia, lub w skrócie zmienna jest odniesieniem. Powiem to inaczej: zmienna „typu referencyjnego” jest referencją. Odnosi się do - lub wskazuje - na przedmiot.
radarbob
40

Zmienna jest inicjalizowany wartością. Obiekt jest tworzony, gdy pamięć jest alokowana do niego i to konstruktor został uruchomiony.

Na przykład tutaj jest zmienna:

Dim obj as Object

Ta zmienna nie została zainicjowana . Po przypisaniu wartości do objzmiennej zmienna zostanie zainicjowana. Oto przykłady inicjalizacji:

obj = 1
obj = "foo"

Tworzenie instancji to zupełnie inna rzecz, ale jest ona powiązana, ponieważ po utworzeniu instancji zwykle następuje inicjalizacja:

Dim obj As New Object()

W poprzednim wierszu kodu objzmienna jest inicjowana z odwołaniem do nowego Object, którego wystąpienie zostało utworzone . Mówimy, że nowa Objectinstancja została utworzona, ponieważ utworzyliśmy jej nową instancję.

Teraz uważam, że VB.NET sprawia, że ​​jest to o wiele bardziej zagmatwane niż C #, ponieważ nie jest jasne, czy przypisanie ma miejsce w powyższym kodzie. W C # jest znacznie wyraźniejsze, że istnieje zarówno instancja instancji, jak i inicjalizacja zmiennej:

Object obj = new Object();
Andrew Hare
źródło
@Andrew obiekt obj = 1; to inicjalizacja, a obiekt obj = nowy obiekt () / to instancja i inicjalizacja, o czym wspomniałeś. Teraz chcę zapytać cię o dwie rzeczy. 1. co to jest? obiekt obj; ? 2. czy pamięć została przydzielona, ​​kiedy używam obiektu obj; ?? lub jest alokowany, gdy inicjalizuję go przez ten obiekt kodu obj = 1; ?
kashif,
Powiedziałbym, że „obiekt obj” jest deklaracją i nie, pamięć nie została jeszcze przydzielona. Lub przynajmniej tyle pamięci, aby pomieścić wartość „null”. Rzeczywista pamięć dla zmiennej zostanie przydzielona na podstawie wartości po jej zainicjowaniu.
Aaron Dake,
14

Aby coś zainicjować, należy ustawić to na wartość początkową. Aby utworzyć instancję, należy utworzyć jej instancję.

Często jest to mniej więcej to samo. To:

SqlConnection conn = new SqlConnection();

wystąpienie do SqlConnectionobiektu i inicjalizuje się connzmienną, ustawiając go w tym przypadku.

Ponieważ konstruktor obiektu również ustawia właściwości obiektu na ich wartości domyślne, często słuszne jest stwierdzenie, że utworzenie wystąpienia obiektu inicjuje go. (Mylące, jeśli obiekt ujawnia metodę, którą musisz jawnie wywołać, aby ją zainicjować po jej utworzeniu, jak to czasami ma miejsce).

Robert Rossney
źródło
4

* Instancja oznacza utworzenie instancji dla klasy lub obiektu Inicjalizacja oznacza * zainicjowanie tego samego obiektu lub klasy w dowolnym celu. **

Sona
źródło
3

Instancja oznacza, że ​​została utworzona instancja obiektu. Zainicjowany oznacza, że ​​ten sam obiekt wykonał pewną inicjalizację.

Gabriel McAdams
źródło
2

Tworząc instancję klasy lub obiektu, tworzysz jej nową instancję lub przydzielasz pamięć, aby ją „wstrzymać”. Inicjalizacja tego obiektu byłaby instrukcją wykonywaną podczas tworzenia instancji.

typoneerror
źródło
2

Tworzenie instancji ma miejsce podczas tworzenia instancji klasy. Ta instancja jest wtedy obiektem i możesz ustawić jej właściwości lub wywołać metody (nakazać jej wykonanie pewnych czynności).

Inicjacja ma miejsce, gdy ustawiasz dla czegoś zestaw warunków początkowych. Tym czymś może być obiekt, w którym każesz mu się zainicjować, lub po prostu zmienna, której przypisujesz wartość.

Obiekt może inicjalizować inne rzeczy, a nawet tworzyć instancje innych obiektów w ramach swojej inicjacji.

Różnica polega na tym, że tworzenie instancji to tworzenie rzeczy, która może coś zrobić; inicjacja to rzecz, którą się robi.

ChrisA
źródło
1

Zobacz dokumentację Java: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

" Point originOne = nowy Point (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."
jaros
źródło
1

Widzimy to w ten sposób. Poniżej znajduje się wiersz kodu:

var p = new Person();

Powyższy wiersz można odczytać na dwa sposoby:

  1. Zmienna p została zainicjowana jako klasa osoby
  2. Klasa Person została utworzona w zmiennej p

Przedmiot odniesienia lub kontekst ma znaczenie. Mówiąc w kategoriach zmiennych używamy słowa inicjalizacja . Mówiąc w kategoriach klasy / typu , używamy słowa instantiate .

MrClan
źródło
0

Tworzenie instancji odnosi się do alokacji pamięci w celu utworzenia instancji klasy, podczas gdy inicjalizacja odnosi się do nazwania tej instancji przez przypisanie nazwy zmiennej do tej instancji.

Na przykład: SqlConnection conn = new SqlConnection();

Oto newsłowo kluczowe, które przydziela pamięć dla instancji i connjest nazwą zmiennej przypisanej do tej instancji.

Rizwan
źródło
0

Inni wyjaśnili różnicę, więc nie będę wchodził w szczegóły. Ale są przypadki, w których tworzenie instancji nie inicjuje poprawnie obiektu. Tworząc instancję obiektu, inicjalizujesz go również z pewnymi danymi. Klasa / typ będzie miał logikę inicjalizacji, podczas gdy logika tworzenia instancji jest zwykle wykonywana przez newsłowo kluczowe (zasadniczo alokacja pamięci, kopiowanie referencji itp.). Jednak tworzenie instancji niekoniecznie musi skutkować poprawnym stanem obiektów, czyli wtedy, gdy możemy powiedzieć, że obiekt nie został zainicjowany . Oto praktyczny przykład, w którym można utworzyć instancję obiektu, ale nie można go zainicjować (przepraszam, np. W C #).

class P { string name = "Ralf"; }

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

GetUninitializedObject nie wywołuje konstruktora w celu utworzenia tam obiektu (ale pewna wewnętrzna magia).

Można również argumentować, że typy wartości nie są tworzone, ale tylko inicjowane, ponieważ nie wymagają one nowej alokacji, kiedy to robisz, new..ale to zależy od definicji wystąpienia.

nawfal
źródło