Ada beberapa pernyataan serupa di VB6: Let, Set, LSet, dan RSet.
Let digunakan untuk penugasan variabel umum:
Copy kode kodenya sebagai berikut:
[Biarkan] varname = ekspresi
Dalam kebanyakan kasus, kami menghilangkan Let dan menetapkan nilai secara langsung dengan tanda sama dengan, sehingga banyak orang bahkan tidak mengetahui keberadaan Let.
Set digunakan untuk penetapan objek, mengarahkan variabel ke objek, dan menambah jumlah referensi objek. Banyak orang yang belum mengetahui apa itu penghitungan referensi.
Jadi untuk apa LSet digunakan? Sekilas terlihat seperti kombinasi Let dan Set, padahal sebenarnya bukan. L di LSet adalah singkatan dari Left, dan padanannya adalah RLet. Anda bertanya kepada saya bagaimana saya tahu bahwa L adalah singkatan dari Left? Dokumen itu mengatakan:
Copy kode kodenya sebagai berikut:
Pernyataan LSet
Meratakan string ke kiri dalam variabel string, atau menyalin variabel dari satu tipe yang ditentukan pengguna ke variabel lain dari tipe yang ditentukan pengguna berbeda.
Pernyataan RSet
Meratakan string ke dalam variabel string ke kanan.
LSet mempunyai satu fungsi lebih dari RSet. Mari kita lihat bagian yang sama terlebih dahulu. Keduanya digunakan untuk menyelaraskan string ke kiri (kanan) dalam sebuah variabel string. Apa maksudnya? Sebenarnya saya belum memahaminya hanya dengan membaca dokumentasinya. Mari kita uji langsung:
Copy kode kodenya sebagai berikut:
Sub Utama()
Redupkan url Sebagai String
Redupkan Sebagai String
Biarkan url = "//www.VeVB.COM"
s = String$(20, "*")
LSet s = url
Debug.Cetak s
RSet s = url
Debug.Cetak s
Akhiri Sub
Output (perhatikan spasi):
Copy kode kodenya sebagai berikut:
//www.VeVB.COM
//www.VeVB.COM
Memang rata kiri dan rata kanan, dan tanda bintang * kita diganti dengan spasi. Menurut pendapat saya, sepertinya itu benar-benar tidak berguna. Saya tidak tahu apa yang dipikirkan desainernya.
Namun, fungsi lain dari LSet sangat kuat. Ia dapat menyalin variabel tipe yang ditentukan pengguna ke variabel tipe yang ditentukan pengguna lainnya. Apa artinya ini?
Izinkan saya memberi Anda sebuah contoh. Apakah Anda tahu alamat IP? IP yang dikembalikan dengan melakukan ping ke Baidu di sini adalah 61.135.169.125. Alamat IP dalam format ini hanya untuk dilihat manusia. IP sebenarnya diwakili oleh bilangan bulat 32-bit di dalam komputer. Bagaimana cara menggunakan VB untuk mengubah alamat IP dalam format xxx.xxx.xxx.xxx menjadi integer 32-bit? Setelah beberapa Google, Anda dapat menulis kode seperti ini:
Copy kode kodenya sebagai berikut:
Sub Utama()
Debug.Cetak IPToLong("61.135.169.125")
Akhiri Sub
Fungsi Pribadi IPToLong (IPStr Sebagai String) Selama
Redupkan Str() Sebagai String, HEXStr Sebagai String, TempStr Sebagai String
Redupkan x Selamanya
Str = Pisahkan(IPStr, ".")
HEXStr = ""
Untuk x = 0 Ke UBound(Str)
SuhuStr = Hex(Str(x))
HEXStr = HEXStr & String(2 - Len(TempStr), "0") & TempStr
x berikutnya
IPToLong = CLng("&H" & HEXStr)
Fungsi Akhir
Kode berfungsi dengan baik, tidak apa-apa, tetapi kita dapat menulis kode yang lebih "lanjutan" menggunakan pernyataan LSet:
Copy kode kodenya sebagai berikut:
Ketik Pribadi myBytes
B1 Sebagai Byte
B2 Sebagai Byte
B3 Sebagai Byte
B4 Sebagai Byte
Tipe Akhir
Ketik Pribadi myLong
Val Selamanya
Tipe Akhir
'Oleh Setan
'http://VeVB.COM
Fungsi Publik IP2Panjang (ip Sebagai String) Selama
Redupkan a() Sebagai String
Redupkan b Sebagai myBytes
Redupkan aku Sebagai Panjangku
a = Pisahkan(ip, ".")
'Catatan Little-Endian
b.B1 = CByte(a(3))
b.B2 = CByte(a(2))
b.B3 = CByte(a(1))
b.B4 = CBita(a(0))
LSet aku = b
IP2Panjang = l.Val
Fungsi Akhir
Gunakan LSet untuk menyalin variabel bertipe myBytes ke variabel bertipe myLong. Ini sangat bagus dan kuat. Lihatlah kode perakitan yang dihasilkan:
Copy kode kodenya sebagai berikut:
00401A0E lea eax, dword ptr [ebp-0x20];
00401A11 tekan eax
00401A12 lea eax, dword ptr [ebp-0x14]; alamat variabel l
00401A15 tekan eax
00401A16 tekan 0x4
00401A18 panggilan __vbaCopyBytes ; jmp ke MSVBVM60.__vbaCopyBytes
Yang disebut __vbaCopyBytes di MSVBVM60.DLL. Parameter pertama adalah byte yang akan disalin, parameter kedua adalah alamat target, dan parameter ketiga adalah alamat sumber. kecuali Urutan parameternya berbeda, dan implementasi internalnya tidak lebih dari instruksi transfer string dalam perakitan:
Copy kode kodenya sebagai berikut:
72A1A0F3 > gerakkan ecx, kata ptr [esp+0x4]
72A1A0F7 tekan esi
72A1A0F8 gerakan esi, kata ptr [esp+0x10]
72A1A0FC mendorong edisi
72A1A0FD memindahkan edi, kata ptr [esp+0x10]
72A1A101 bergerak eax,ecx
72A1A103 pindah edx, edi
72A1A105 shrecx, 0x2
72A1A108 rep movs dword ptr es:[edi], dword ptr [esi]
72A1A10A bergerak ecx, eax
72A1A10C bergerak eax, edx
72A1A10E dan ecx, 0x3
72A1A111 rep movs byte ptr es:[edi], byte ptr [esi]
72A1A113 popi
72A1A114 pop esi
72A1A115 kembali 0xC
Perlu dicatat bahwa dokumentasi tersebut memperingatkan kita:
Copy kode kodenya sebagai berikut:
Peringatan Menggunakan LSet untuk menyalin variabel dari satu tipe yang ditentukan pengguna ke dalam variabel dengan tipe yang ditentukan pengguna berbeda tidak disarankan. Menyalin data dari satu tipe data ke ruang yang disediakan untuk tipe data berbeda dapat menyebabkan hasil yang tidak terduga.
Saat Anda menyalin variabel dari satu tipe yang ditentukan pengguna ke tipe lainnya, data biner dari satu variabel disalin ke ruang memori variabel lainnya, tanpa memperhatikan tipe data yang ditentukan untuk elemen tersebut.
Menggunakan LSet untuk menyalin variabel tipe yang ditentukan pengguna tidak disarankan dan dapat menyebabkan hasil yang tidak diharapkan (seperti struktur yang tidak selaras), jadi jangan gunakan pernyataan LSet kecuali Anda tahu apa yang Anda lakukan.