Saya baru mengenal Delphi, dan saya telah menjalankan beberapa tes untuk melihat variabel objek dan variabel tumpukan apa yang diinisialisasi secara default:
TInstanceVariables = class
fBoolean: boolean; // always starts off as false
fInteger: integer; // always starts off as zero
fObject: TObject; // always starts off as nil
end;
Ini adalah perilaku yang biasa saya lakukan dari bahasa lain, tetapi saya bertanya-tanya apakah aman untuk mengandalkannya di Delphi? Misalnya, saya bertanya-tanya apakah itu mungkin bergantung pada pengaturan kompiler, atau mungkin bekerja secara berbeda pada mesin yang berbeda. Apakah normal untuk mengandalkan nilai default yang diinisialisasi untuk objek, atau apakah Anda secara eksplisit menyetel semua variabel instance dalam konstruktor?
Sedangkan untuk variabel stack (procedure-level), pengujian saya menunjukkan bahwa boolean yang disatukan adalah benar, integer yang disatukan adalah 2129993264, dan objek yang tidak terinialisasi hanyalah pointer yang tidak valid (yaitu tidak nihil). Saya menduga normanya adalah selalu menetapkan variabel tingkat prosedur sebelum mengaksesnya?
Jawaban:
Ya, ini adalah perilaku yang didokumentasikan:
Bidang objek selalu diinisialisasi ke 0, 0.0, '', False, nil atau apa pun yang berlaku.
Variabel global selalu diinisialisasi ke 0 dll juga;
Variabel yang dihitung oleh referensi lokal * selalu diinisialisasi menjadi nol atau '';
Variabel lokal yang tidak dihitung referensi * * tidak diinisialisasi sehingga Anda harus menetapkan nilai sebelum dapat menggunakannya.
Saya ingat Barry Kelly di suatu tempat menulis definisi untuk "referensi-dihitung", tetapi tidak dapat menemukannya lagi, jadi ini harus dilakukan untuk sementara:
Catatan:
record
itu sendiri tidak cukup untuk menjadi referensi yang dihitungsumber
TObject.Create
, yang merupakan metode void, tetapiclass function TObject.InitInstance(Instance: Pointer): TObject;
SELALU dipanggil sebelum panggilan konstruktor, bahkan untuk versi Delphi yang lebih lama. Komentar Anda salah IMHO dan membingungkan.Variabel global yang tidak memiliki penginisialisasi eksplisit dialokasikan di bagian BSS di file yang dapat dieksekusi. Mereka tidak benar-benar mengambil ruang apa pun di EXE; bagian BSS adalah bagian khusus yang dialokasikan oleh OS dan dihapus ke nol. Di sistem operasi lain, ada mekanisme serupa.
Anda dapat bergantung pada variabel global yang diinisialisasi nol.
sumber
Bidang kelas default nol. Ini didokumentasikan sehingga Anda dapat mengandalkannya. Variabel tumpukan lokal tidak ditentukan kecuali string atau antarmuka, ini disetel ke nol.
sumber
Sebagai catatan tambahan (karena Anda baru mengenal Delphi): Variabel global dapat diinisialisasi secara langsung saat mendeklarasikannya:
sumber
Berikut kutipan dari Ray Lischners Delphi in a Nutshell Bab 2
Memang benar bahwa variabel dalam lingkup lokal perlu diinisialisasi ... Saya akan menganggap komentar di atas bahwa "Variabel global diinisialisasi" sebagai meragukan sampai diberikan referensi - Saya tidak percaya itu.
sunting ... Barry Kelly mengatakan Anda dapat bergantung pada mereka yang diinisialisasi nol, dan karena dia berada di tim penyusun Delphi, saya yakin itu berlaku :) Terima kasih Barry.
sumber
Variabel global dan data contoh objek (bidang) selalu diinisialisasi ke nol. Variabel lokal dalam prosedur dan metode tidak diinisialisasi di Win32 Delphi; isinya tidak terdefinisi sampai Anda menetapkan nilai dalam kode.
sumber
Meskipun suatu bahasa memang menawarkan inisialisasi default, saya tidak yakin Anda harus mengandalkannya. Menginisialisasi suatu nilai membuatnya lebih jelas bagi pengembang lain yang mungkin tidak tahu tentang inisialisasi default dalam bahasa dan mencegah masalah di seluruh kompiler.
sumber
Dari file bantuan Delphi 2007:
ms-help: //borland.bds5/devcommon/variables_xml.html
sumber
Saya memiliki sedikit keluhan dengan jawaban yang diberikan. Delphi mengosongkan ruang memori global dan objek yang baru dibuat. Meskipun ini secara NORMAL berarti mereka diinisialisasi, ada satu kasus di mana mereka tidak: tipe yang disebutkan dengan nilai tertentu. Bagaimana jika nol bukanlah nilai hukum ??
sumber
TOneTwoThree = (One=1, Two=2, Three=3);
Variabel sebaris yang baru diperkenalkan (sejak Delphi 10.3) membuat kontrol nilai awal lebih mudah.
sumber