Perilaku ini sangat mirip dengan Array.Resizemetode di .NET. Untuk memahami apa yang terjadi, mungkin berguna untuk melihat sejarah .token di C, C ++, Java, C #, dan Swift.
Dalam C, struktur tidak lebih dari agregasi variabel. Menerapkannya .ke variabel tipe struktur akan mengakses variabel yang disimpan dalam struktur. Pointer ke objek tidak memiliki agregasi variabel, tetapi mengidentifikasi mereka. Jika seseorang memiliki pointer yang mengidentifikasi struktur, ->operator dapat digunakan untuk mengakses variabel yang disimpan dalam struktur yang diidentifikasi oleh pointer.
Dalam C ++, struktur dan kelas tidak hanya variabel agregat, tetapi juga dapat melampirkan kode padanya. Menggunakan .untuk memanggil suatu metode akan pada variabel meminta metode itu untuk bertindak atas isi dari variabel itu sendiri ; menggunakan ->pada variabel yang mengidentifikasi objek akan meminta metode itu untuk bertindak atas objek yang diidentifikasi oleh variabel.
Di Jawa, semua tipe variabel kustom hanya mengidentifikasi objek, dan memanggil metode pada variabel akan memberi tahu metode objek apa yang diidentifikasi oleh variabel. Variabel tidak dapat menampung segala jenis tipe data komposit secara langsung, juga tidak ada cara yang digunakan suatu metode untuk mengakses variabel yang diminta. Pembatasan ini, meskipun secara semantik membatasi, sangat menyederhanakan runtime, dan memfasilitasi validasi bytecode; penyederhanaan seperti itu mengurangi overhead sumber daya Jawa pada saat pasar peka terhadap masalah-masalah seperti itu, dan dengan demikian membantunya mendapatkan daya tarik di pasar. Mereka juga berarti bahwa tidak perlu token yang setara dengan yang .digunakan dalam C atau C ++. Meskipun Java bisa digunakan ->dengan cara yang sama seperti C dan C ++, pembuatnya memilih untuk menggunakan karakter tunggal. karena itu tidak diperlukan untuk tujuan lain.
Dalam C # dan bahasa .NET lainnya, variabel dapat mengidentifikasi objek atau memegang tipe data komposit secara langsung. Ketika digunakan pada variabel tipe data komposit, .bertindak atas isi variabel; ketika digunakan pada variabel tipe referensi, .bertindak atas objek yang diidentifikasioleh itu. Untuk beberapa jenis operasi, perbedaan semantik tidak terlalu penting, tetapi untuk yang lain itu. Situasi paling problematis adalah situasi di mana metode tipe data komposit yang akan memodifikasi variabel yang digunakan, dipanggil pada variabel read-only. Jika suatu upaya dilakukan untuk memanggil metode pada nilai atau variabel read-only, kompiler umumnya akan menyalin variabel, membiarkan metode bertindak atas hal itu, dan membuang variabel. Ini umumnya aman dengan metode yang hanya membaca variabel, tetapi tidak aman dengan metode yang menulisnya. Sayangnya,. Belum memiliki sarana untuk menunjukkan metode mana yang dapat digunakan dengan aman dengan substitusi tersebut dan yang tidak.
Di Swift, metode pada agregat dapat secara tegas menunjukkan apakah mereka akan memodifikasi variabel yang mereka gunakan, dan kompiler akan melarang penggunaan metode bermutasi pada variabel read-only (daripada meminta mereka memalsukan salinan sementara dari variabel yang kemudian akan dibuang). Karena perbedaan ini, menggunakan .token untuk memanggil metode yang memodifikasi variabel yang mereka gunakan jauh lebih aman di Swift daripada di .NET. Sayangnya, fakta bahwa .token yang sama digunakan untuk tujuan itu untuk bertindak pada objek eksternal yang diidentifikasi oleh variabel berarti kemungkinan untuk kebingungan tetap ada.
Jika punya mesin waktu dan kembali ke penciptaan C # dan / atau Swift, salah satu surut bisa menghindari banyak kebingungan seputar isu-isu tersebut dengan memiliki bahasa menggunakan .dan ->token dalam mode lebih dekat dengan C ++ penggunaan. Metode agregat dan tipe referensi dapat digunakan .untuk bertindak berdasarkan variabel yang mereka gunakan , dan ->untuk bertindak berdasarkan nilai (untuk komposit) atau hal yang diidentifikasi dengan demikian (untuk jenis referensi). Namun, tidak ada bahasa yang dirancang seperti itu.
Dalam C #, praktik normal untuk metode untuk memodifikasi variabel yang dipanggil adalah untuk lulus variabel sebagai refparameter ke metode. Dengan demikian panggilan Array.Resize(ref someArray, 23);saat someArraymengidentifikasi array 20 elemen akan menyebabkan someArraymengidentifikasi array baru dari 23 elemen, tanpa mempengaruhi array asli. Penggunaan refmemperjelas bahwa metode harus diharapkan untuk memodifikasi variabel yang diminta. Dalam banyak kasus, menguntungkan untuk dapat memodifikasi variabel tanpa harus menggunakan metode statis; Alamat swift artinya dengan menggunakan .sintaks. Kerugiannya adalah tidak ada kejelasan tentang metode apa yang berlaku pada variabel dan metode apa yang berlaku pada nilai.