Saya bertanya-tanya apakah ada yang masih menggunakan sintaks kata kunci "goto" di C # dan alasan apa yang mungkin ada untuk melakukannya.
Saya cenderung melihat pernyataan apa pun yang menyebabkan pembaca melompati kode sebagai praktik buruk tetapi bertanya-tanya apakah ada skenario yang kredibel untuk menggunakan sintaks seperti itu?
c#
.net
coding-style
goto
Brian Scott
sumber
sumber
goto
untuk memutus lingkaran dan kembali ke pernyataan awal sesuai dengan kondisi tertentuJawaban:
Ada beberapa kasus (jarang) di mana goto sebenarnya dapat meningkatkan keterbacaan. Faktanya, dokumentasi yang Anda tautkan mencantumkan dua contoh:
Inilah contoh untuk yang terakhir:
Tentu saja, ada cara lain untuk mengatasi masalah ini juga, seperti memfaktorkan ulang kode menjadi fungsi, menggunakan blok dummy di sekitarnya, dll. (Lihat pertanyaan ini untuk detailnya). Sebagai catatan tambahan, desainer bahasa Java memutuskan untuk melarang goto sepenuhnya dan memperkenalkan pernyataan break berlabel sebagai gantinya.
sumber
Saya ingat bagian ini
Untuk sesuatu seperti ini
Lihat Ini
sumber
Saya menggunakannya secara ekstensif di Eduasync untuk menunjukkan jenis kode yang dihasilkan kompilator untuk Anda saat menggunakan metode asinkron di C # 5. Anda akan melihat hal yang sama di blok iterator.
Namun dalam kode "normal", saya tidak dapat mengingat kapan terakhir kali saya menggunakannya ...
sumber
goto sangat bagus untuk memecah banyak loop di mana break tidak akan berfungsi dengan baik (katakanlah pada kondisi kesalahan), dan seperti yang dikatakan Kragen, goto digunakan oleh kompiler untuk menghasilkan pernyataan switch dan beberapa hal lainnya juga.
sumber
Saya tidak ingat pernah menggunakan
goto
. Tapi mungkin itu meningkatkan maksud loop selamanya yang Anda benar-benar tidak ingin keluar (tidakbreak
, tetapi Anda masih bisareturn
atauthrow
):Kemudian lagi, yang sederhana
while (true)
sudah cukup ...Selain itu, Anda dapat menggunakan dalam situasi di mana Anda ingin iterasi pertama dari sebuah loop dimulai di tengah-tengah loop: lihat di sini sebagai contoh.
sumber
goto
.. danwhile(true) {..}
bukan merupakan penggunaan yang menarik ..Kompilator menggunakan
goto
pernyataan dalam berbagai bagian kode yang dihasilkan, misalnya dalam jenis blok iterator yang dihasilkan (dihasilkan saat menggunakanyield return
kata kunci - Saya cukup yakin bahwa jenis serialisasi XML yang dihasilkan juga memiliki beberapagoto
pernyataan di sana juga.Lihat detail implementasi blok Iterator: mesin status yang dibuat secara otomatis untuk beberapa detail selengkapnya tentang mengapa / bagaimana compiler C # menangani ini.
Selain kode yang dihasilkan, tidak ada alasan yang baik untuk menggunakan
goto
pernyataan dalam kode normal - ini membuat kode lebih sulit untuk dipahami dan akibatnya lebih rentan terhadap kesalahan. Di sisi lain, menggunakangoto
pernyataan dalam kode yang dihasilkan seperti ini dapat menyederhanakan proses pembuatan dan biasanya baik-baik saja karena tidak ada yang akan membaca (atau memodifikasi) kode yang dihasilkan dan tidak ada kemungkinan kesalahan dibuat karena mesin sedang melakukan penulisan.Lihat Pernyataan Go-to yang dianggap berbahaya untuk argumen yang menentang
goto
serta bagian klasik dari sejarah pemrograman.sumber
goto
tidak. Sesuatu untuk dipertimbangkan.Prosesor menerapkan setidaknya satu instruksi lompatan dan saya yakin banyak pernyataan menggunakan itu dalam implementasi atau interpretasi mereka.
Salah satu hal baik tentang menggunakan bahasa generasi ke - 3 atau ke - 4 adalah detail fisik ini disarikan dari kita. Sementara kita harus memperhatikan hukum abstraksi bocor, saya pikir kita juga harus menggunakan alat kita sebagaimana mestinya ( maaf ). Jika saya menulis kode dan
goto
sepertinya ide yang bagus, sekarang saatnya untuk melakukan refactor. Tujuan dari bahasa terstruktur adalah untuk menghindari "lompatan" ini dan untuk menciptakan alur logis dalam rekayasa kami.Saya harus menghindari penggunaan
break
tetapi saya tidak bisa mengabaikan manfaat kinerja. Namun, jika saya memiliki loop bersarang yang saling membutuhkanbreak
, inilah saatnya untuk melakukan refactor.Jika ada yang bisa mengusulkan penggunaan
goto
yang tampaknya lebih baik daripada refactoring, saya dengan senang hati akan menarik jawaban saya.Saya harap saya tidak bersalah karena terburu-buru ke " gudang sepeda " di sini. Seperti yang dikatakan Kragen, apa yang cukup baik untuk Dijkstra sudah cukup baik untuk saya.
sumber
dynamic
objek dan berjalan, itu adalah grafik objek yang berisi banyak kamus untuk mendapatkan nilai yang saya butuhkan. Tidak masuk akal untuk menggunakan metode yang memiliki parameterdynamic
namun mengharapkan bentuk objek yang tepat. Dengan kebagian untuk memecah beberapa lapisan dan terus berjalan melalui koleksi benda-benda ini. [Saya tidak memiliki tipe jadi saya tidak dapat memberikan akses yang lebih baik, jadi refleksi atau dinamis]Goto tidak pernah lebih baik. Dan lanjutkan, break (kecuali dalam switch / case), (multiple) return, dan throw juga harus dijaga seminimal mungkin. Anda tidak ingin melarikan diri dari tengah loop sarang. Anda selalu ingin pernyataan kontrol loop memiliki semua kontrol loop. Indentasi memiliki informasi, dan semua pernyataan ini membuang informasi itu. Anda mungkin juga menghapus semua indentasi.
sumber