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?
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?
Jawaban:
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 .
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.
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.
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!)
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:
MyClass myClassyReferencenew MyClass()=.Menyatakan kembali fakta:
Variabel tipe referensi juga disebut "referensi". "Variabel jenis nilai" bukan referensi.
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.
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
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.
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();
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.)
Instantiated berarti sebuah instance dari objek telah dibuat. Initiated berarti objek yang sama telah melakukan beberapa inisialisasi.
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.
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.
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."
Kita bisa melihatnya seperti ini. Untuk baris kode di bawah ini:
var p = new Person();
Baris di atas dapat dibaca dengan dua cara berikut:
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 .
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.
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.