Apa perbedaan antara "dipakai" dan "diinisialisasi"?

105

Saya telah mendengar dua kata ini digunakan dalam tutorial Microsoft untuk VB.NET. Apa perbedaan antara kedua kata ini jika digunakan untuk merujuk pada variabel?

l --''''''--------- '' '' '' '' '' ''
sumber

Jawaban:

142

Nilai vis-a-vis Jenis Referensi

Variabel di C # ada di 1 dari 2 grup. Jenis nilai atau jenis Referensi . Tipe suka intdan DateTimemerupakan tipe nilai . Sebaliknya, setiap kelas yang Anda buat adalah tipe referensi . String C # juga merupakan tipe referensi . Kebanyakan hal dalam kerangka .NET adalah tipe referensi .

Bagian dari Variabel

Ada nama variabel dan nilainya . Dua bagian .

Variabel ini nama adalah apa yang Anda menyatakan hal itu terjadi. The nilai adalah apa yang Anda tetapkan untuk itu.

Variabel diinisialisasi

Semua variabel selalu diberi nilai awal pada saat variabel tersebut dideklarasikan . Jadi semua variabel diinisialisasi .

Untuk tipe nilai , seperti intkompilator akan memberi mereka nilai yang valid jika Anda tidak melakukannya secara eksplisit. int's menginisialisasi ke nol secara default, DateTime' s inisialisasi untuk DateTime.MinValuesecara default.

Variabel tipe referensi diinisialisasi ke objek yang Anda berikan. Kompilator tidak akan menetapkan objek (yaitu nilai yang valid) jika Anda tidak melakukannya. Dalam hal ini nilainya null- tidak ada. Jadi kami mengatakan bahwa referensi diinisialisasi ke null.

Objek Instantiated

Manusia lahir. Objek dibuat instance-nya. Seorang bayi adalah turunan dari Manusia, sebuah objek adalah turunan dari suatu Kelas.

Tindakan membuat instance Kelas disebut instantiation (Ta-Da!)

Jadi nyatakan , inisialisasi , dan instantiate datang bersama seperti ini

MyClass myClassyReference = new MyClass();

Di atas, adalah salah untuk mengatakan "... membuat instance dari suatu objek ..."


edit - terinspirasi oleh diskusi komentar

Tiga hal berbeda sedang terjadi (di atas) menggunakan terminologi berbeda dan terminologi itu tidak dapat dipertukarkan:

  1. Variabel referensi dideklarasikan - MyClass myClassyReference
  2. Sebuah objek dibuat instance-nya (... dari / dari kelas tertentu , tersirat) -new MyClass()
  3. Objek ditugaskan ke variabel. =.

Menyatakan kembali fakta:

  1. Variabel tipe referensi juga disebut "referensi". "Variabel jenis nilai" bukan referensi.

  2. Ini: "objectA adalah turunan dari suatu objek" sangat salah. Jika objectA adalah "turunan dari objectB" maka itu harus objectA memulai kehidupan dengan tipe objectB - apapun itu - dan status saat ini - apapun itu. Bagaimana dengan membuat objek D, E, dan F saat objekB berubah? Tidak, tidak! Ini adalah kasus konseptual dan teknis "objectA adalah turunan dari Kelas". "Instansiasi" dan "instance dari" memiliki arti yang tepat - sebuah objek mendapatkan jenis, definisi, dan nilainya dari Kelas.

  3. MyClass myClassyReference = null Umumnya kita tidak mengatakan "variabel ditugaskan ke null" dan kita tidak pernah mengatakan "variabel mereferensikan null", Tidak. Sebaliknya kita mengatakan "variabel adalah null"; atau "variabel tidak mereferensikan apa pun", atau "referensinya nihil"

Aplikasi praktis:

  • Saya mengarahkan jari saya ke kode Anda dan berkata "instance ini memiliki properti yang tidak valid. Mungkin itulah sebabnya loop gagal. Anda harus memvalidasi parameter selama pembuatan instance." (yaitu argumen konstruktor).

  • Saya melihat ini di kode Anda,

    MyClass myClassyReference;
    myClassyReference.DoSomething();

    "Anda mendeklarasikan variabel tetapi tidak pernah menetapkannya. Nol jadi tidak mereferensikan apa pun. Itulah mengapa pemanggilan metode memunculkan pengecualian."

akhir edit


Lightness of Being yang Tak Tertahankan

Sebuah tipe referensi nama dan nilai variabel ada secara independen. Dan maksud saya mandiri.

Sebuah dipakai objek mungkin atau mungkin tidak memiliki referensi untuk itu.

Sebuah dipakai objek mungkin memiliki banyak referensi untuk itu.

Sebuah dinyatakan referensi mungkin atau mungkin tidak menunjuk ke suatu objek.

radarbob
sumber
Penjelasan yang sempurna!
M. Fawad Surosh
Jika salah mengatakan: "... membuat instance dari suatu objek ...", apa yang harus Anda katakan? "... membuat instance suatu objek, dan memberikan referensi padanya ..."?
Aaron Dake
Atau bagaimana dengan: "... membuat instance objek, dan menginisialisasi variabel ke referensinya"? Itu termasuk kedua kata tersebut dan sepertinya mengeja semuanya - meskipun, dengan cara yang agak panjang. Bagaimana menurut anda?
Aaron Dake
... apa yang harus kamu katakan? Katakan: "membuat turunan kelas", bukan '... objek'. Dan "memberi contoh variabel ke referensi darinya" adalah pembicaraan ganda dan salah dalam 2 cara: (1) hanya Objek yang dipakai. (2) Variabel yang menunjuk ke suatu objek adalah variabel referensi, atau singkatnya variabel tersebut adalah referensi. Saya akan mengatakannya secara berbeda: Variabel "tipe referensi" adalah referensi. Ini mengacu pada - atau menunjuk ke - suatu objek.
radarbob
40

Sebuah variabel diinisialisasi dengan nilai. Sebuah objek dibuat instance-nya ketika memori dialokasikan untuknya dan konstruktornya telah dijalankan.

Misalnya di sini adalah variabel:

Dim obj as Object

Variabel ini belum diinisialisasi . Setelah saya memberikan nilai ke objvariabel, variabel akan diinisialisasi. Berikut contoh inisialisasi:

obj = 1
obj = "foo"

Instansiasi adalah hal yang sangat berbeda tetapi terkait karena instansiasi biasanya diikuti dengan inisialisasi:

Dim obj As New Object()

Pada baris sebelumnya kode, objvariabel diinisialisasi dengan mengacu pada baru Objectyang dipakai . Kami mengatakan bahwa yang baru Objectdibuat instance-nya karena kami telah membuat instance baru darinya.

Sekarang saya percaya bahwa VB.NET membuat ini jauh lebih membingungkan daripada C # karena tidak jelas bahwa suatu penugasan sedang berlangsung dalam kode di atas. Di C #, jauh lebih jelas bahwa ada instance instance dan inisialisasi variabel:

Object obj = new Object();
Andrew Hare
sumber
@Andrew objek obj = 1; adalah inisialisasi dan objek obj = objek baru () / adalah instantiasi dan inisialisasi ini adalah apa yang telah Anda sebutkan. Sekarang saya ingin menanyakan dua hal. 1. apa ini? objek obj; ? 2. Apakah memori telah dialokasikan ketika saya menggunakan object obj; ?? atau dialokasikan ketika saya menginisialisasi dengan objek kode ini obj = 1; ?
kashif
Saya akan mengatakan "object obj" adalah deklarasi, dan tidak, memori belum dialokasikan. Atau setidaknya hanya cukup memori untuk menampung nilai "null". Memori aktual untuk variabel akan dialokasikan berdasarkan nilai setelah diinisialisasi.
Aaron Dake
14

Untuk menginisialisasi sesuatu adalah mengaturnya ke nilai awalnya. Untuk memberi contoh sesuatu adalah untuk menciptakan sebuah instance dari itu.

Seringkali ini adalah hal yang kurang lebih sama. Ini:

SqlConnection conn = new SqlConnection();

instantiates sebuah SqlConnectionobjek, dan menginisialisasi yangconn variabel dengan menetapkan ke contoh itu.

Karena konstruktor objek juga menyetel properti objek ke nilai defaultnya, sering kali tepat untuk mengatakan bahwa membuat instance objek menginisialisasinya. (Menyesatkan, jika objek memperlihatkan metode yang harus Anda panggil secara eksplisit untuk menginisialisasi setelah dibuat, seperti yang terkadang terjadi.)

Robert Rossney
sumber
4

* Instansiasi berarti membuat instance untuk kelas atau objek. Inisialisasi berarti * memulai objek atau kelas yang sama untuk tujuan apa pun. **

Sona
sumber
3

Instantiated berarti sebuah instance dari objek telah dibuat. Initiated berarti objek yang sama telah melakukan beberapa inisialisasi.

Gabriel McAdams
sumber
2

Saat Anda membuat instance kelas atau objek, Anda membuat instance baru darinya, atau mengalokasikan memori untuk "menampung" satu. Menginisialisasi objek itu akan menjadi instruksi yang dilakukan selama pembuatan contoh.

typeoneerror
sumber
2

Instansiasi adalah saat Anda membuat instance kelas. Instance itu kemudian menjadi objek, dan Anda dapat menyetel propertinya, atau memanggil metode di atasnya (perintahkan untuk melakukan sesuatu).

Inisiasi adalah saat Anda menyiapkan sekumpulan kondisi awal untuk sesuatu. Sesuatu itu mungkin sebuah objek, di mana Anda menyuruhnya untuk memulai sendiri, atau hanya variabel yang Anda tetapkan nilainya.

Sebuah objek mungkin menginisialisasi beberapa hal lain, atau bahkan membuat instance objek lain sebagai bagian dari inisiasinya.

Perbedaannya adalah bahwa instantiation adalah penciptaan sesuatu yang dapat melakukan sesuatu; inisiasi adalah hal-hal yang diselesaikan.

ChrisA
sumber
1

Lihat dokumen Java: https://docs.oracle.com/javase/tutorial/java/javaOO/objectcreation.html

" Titik originOne = Titik baru (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
sumber
1

Kita bisa melihatnya seperti ini. Untuk baris kode di bawah ini:

var p = new Person();

Baris di atas dapat dibaca dengan dua cara berikut:

  1. Variabel p telah diinisialisasi sebagai kelas person
  2. Kelas orang telah dipakai dalam variabel p

Subjek referensi atau konteks itu penting. Saat berbicara dalam istilah variabel , kami menggunakan kata inisialisasi . Saat berbicara dalam istilah kelas / tipe , kami menggunakan kata instantiate .

MrClan
sumber
0

Instansiasi mengacu pada alokasi memori untuk membuat instance kelas sedangkan inisialisasi mengacu pada penamaan instance itu dengan menetapkan nama variabel ke instance itu.

Misalnya: SqlConnection conn = new SqlConnection();

Berikut newadalah kata kunci yang mengalokasikan memori untuk sebuah instance dan connmerupakan nama variabel yang diberikan untuk instance itu.

Rizwan
sumber
0

Orang lain telah menjelaskan perbedaannya, jadi saya tidak akan menjelaskan secara detail. Tetapi ada kasus di mana instantiation tidak menginisialisasi objek dengan benar. Saat Anda membuat instance objek, Anda juga menginisialisasinya dengan beberapa data. Kelas / tipe akan memiliki logika inisialisasi, sedangkan logika instantiation biasanya dilakukan oleh newkata kunci (pada dasarnya alokasi memori, penyalinan referensi, dll). Tapi instantiation tidak perlu menghasilkan status yang valid untuk objek, yaitu ketika kita dapat mengatakan objek tersebut tidak diinisialisasi . Berikut adalah contoh praktis di mana sebuah objek dapat dipakai tetapi tidak diinisialisasi (maaf misalnya di C #).

class P { string name = "Ralf"; }

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

GetUninitializedObject tidak memanggil konstruktor untuk membuat instance objek di sana (tetapi beberapa keajaiban internal).

Seseorang juga dapat berargumen bahwa tipe nilai tidak dibuat instance-nya tetapi hanya diinisialisasi karena tidak memerlukan alokasi baru ketika Anda melakukannya, new..tetapi itu tergantung pada definisi instantiasi seseorang.

nawfal
sumber