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?
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?
Odpowiedzi:
Zmienne w C # są w 1 z 2 grup. Typy wartości lub typy odwołań . Typy takie jak int
i DateTime
są 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 .
Jest nazwa zmiennej i jej wartość . Dwie części .
Zmienna jest nazwa jest to, co deklarują , że jest. Wartość jest co przypisać do niego.
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 int
kompilator, poda im prawidłową wartość, jeśli nie zrobisz tego jawnie. int
„s zainicjować zero domyślnie DateTime
” s zainicjować aby DateTime.MinValue
domyś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.
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!)
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:
MyClass myClassyReference
new MyClass()
=
.Ponowne przedstawienie faktów:
Zmienna typu referencyjnego jest również nazywana po prostu „referencją”. „Zmienna typu wartości” nie jest odniesieniem.
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.
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
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.
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 obj
zmiennej 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 obj
zmienna jest inicjowana z odwołaniem do nowego Object
, którego wystąpienie zostało utworzone . Mówimy, że nowa Object
instancja 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();
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 SqlConnection
obiektu i inicjalizuje się conn
zmienną, 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).
Instancja oznacza, że została utworzona instancja obiektu. Zainicjowany oznacza, że ten sam obiekt wykonał pewną inicjalizację.
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.
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.
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."
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:
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 .
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 new
słowo kluczowe, które przydziela pamięć dla instancji i conn
jest nazwą zmiennej przypisanej do tej instancji.
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 new
sł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.