MSDN mengatakan bahwa Anda harus menggunakan struct ketika Anda membutuhkan benda ringan. Apakah ada skenario lain ketika struct lebih disukai daripada kelas?
Beberapa orang mungkin lupa bahwa:
- struct dapat memiliki metode.
- struct tidak dapat diwarisi.
Saya memahami perbedaan teknis antara struct dan kelas, saya hanya tidak memiliki perasaan yang baik tentang kapan harus menggunakan struct.
Jawaban:
MSDN memiliki jawabannya: Memilih Antara Kelas dan Struktur .
Pada dasarnya, halaman itu memberi Anda daftar periksa 4-item dan mengatakan untuk menggunakan kelas kecuali tipe Anda memenuhi semua kriteria.
sumber
ref
parameter setiap kali masuk akal untuk melakukannya. Mengirimkan struct dengan 4.000 bidang sebagai parameter ref ke metode yang mengubah satu akan lebih murah daripada melewati struct dengan 4 bidang dengan nilai ke metode yang mengembalikan versi yang dimodifikasi.Saya terkejut saya belum membaca jawaban sebelumnya yang mana, yang saya anggap sebagai aspek paling penting:
Saya menggunakan struct ketika saya ingin jenis tanpa identitas. Misalnya titik 3D:
Jika Anda memiliki dua contoh dari struct ini Anda tidak peduli apakah mereka adalah satu bagian data dalam memori atau dua. Anda hanya peduli dengan nilai yang mereka miliki.
sumber
return false
adalah apa yang seharusnya ada di sana, mengoreksi sekarang.Bill Wagner memiliki bab tentang ini dalam bukunya "efektif c #" ( http://www.amazon.com/Effective-Specific-Ways-Improve-Your/dp/0321245660 ). Dia menyimpulkan dengan menggunakan prinsip berikut:
sumber
Gunakan struct ketika Anda ingin semantik tipe nilai bukan tipe referensi. Struct adalah copy-by-value jadi hati-hati!
Lihat juga pertanyaan sebelumnya, mis
Apa perbedaan antara struct dan kelas di .NET?
sumber
Saya akan menggunakan struct ketika:
suatu objek seharusnya hanya dibaca (setiap kali Anda lulus / menetapkan struct itu akan disalin). Hanya membaca objek yang bagus ketika datang ke pemrosesan multithreaded karena mereka tidak cukup mengunci dalam banyak kasus.
sebuah benda kecil dan berumur pendek. Dalam kasus seperti itu ada kemungkinan besar bahwa objek akan dialokasikan pada tumpukan yang jauh lebih efisien daripada meletakkannya di tumpukan yang dikelola. Terlebih lagi memori yang dialokasikan oleh objek akan dibebaskan segera setelah melampaui ruang lingkupnya. Dengan kata lain itu kurang berfungsi untuk Pengumpul Sampah dan memori yang digunakan lebih efisien.
sumber
Gunakan kelas jika:
Gunakan struktur jika:
sumber
Saya selalu menggunakan struct ketika saya ingin mengelompokkan beberapa nilai untuk melewati sesuatu dari pemanggilan metode, tapi saya tidak perlu menggunakannya untuk apa pun setelah saya membaca nilai-nilai itu. Sama seperti cara untuk menjaga kebersihan. Saya cenderung melihat hal-hal dalam struct sebagai "membuang" dan hal-hal di kelas sebagai lebih berguna dan "fungsional"
sumber
Jika suatu entitas akan berubah, pertanyaan apakah akan menggunakan struct atau kelas umumnya akan menjadi salah satu kinerja daripada semantik. Pada sistem 32/64-bit, referensi kelas membutuhkan 4/8 byte untuk disimpan, terlepas dari jumlah informasi di kelas; menyalin referensi kelas akan membutuhkan menyalin 4/8 byte. Di sisi lain, setiap berbedainstance kelas akan memiliki 8/16 byte overhead di samping informasi yang dimilikinya dan biaya memori referensi untuk itu. Misalkan seseorang menginginkan array 500 entitas, masing-masing memegang empat bilangan bulat 32-bit. Jika entitas adalah tipe struktur, array akan membutuhkan 8.000 byte terlepas dari apakah semua 500 entitas semuanya identik, semua berbeda, atau di antara keduanya. Jika entitas adalah tipe kelas, array 500 referensi akan mengambil 4.000 byte. Jika referensi semua menunjuk ke objek yang berbeda, objek akan memerlukan tambahan 24 byte masing-masing (12.000 byte untuk semua 500), total 16.000 byte - dua kali biaya penyimpanan dari jenis struct. Di sisi lain, dari kode yang dibuat satu objek instance dan kemudian disalin referensi ke semua 500 array slot, total biaya akan menjadi 24 byte untuk instance itu dan 4, 000 untuk array - total 4.024 byte. Penghematan besar. Beberapa situasi akan berhasil serta yang terakhir, tetapi dalam beberapa kasus mungkin untuk menyalin beberapa referensi ke slot array yang cukup untuk membuat berbagi seperti itu bermanfaat.
Jika entitas seharusnya bisa berubah, pertanyaan apakah menggunakan kelas atau struct dalam beberapa hal lebih mudah. Asumsikan "Benda" adalah suatu struct atau kelas yang memiliki bidang bilangan bulat yang disebut x, dan seseorang melakukan kode berikut:
Apakah orang ingin pernyataan yang terakhir mempengaruhi t1.x?
Jika Benda adalah tipe kelas, t1 dan t2 akan sama, artinya t1.x dan t2.x juga akan setara. Dengan demikian, pernyataan kedua akan mempengaruhi t1.x. Jika Benda adalah tipe struktur, t1 dan t2 akan menjadi instance yang berbeda, artinya t1.x dan t2.x akan merujuk ke bilangan bulat yang berbeda. Dengan demikian, pernyataan kedua tidak akan mempengaruhi t1.x.
Struktur yang dapat berubah dan kelas yang dapat berubah memiliki perilaku yang berbeda secara mendasar, meskipun .net memiliki beberapa kebiasaan dalam penanganan mutasi struktural. Jika seseorang menginginkan perilaku tipe-nilai (artinya "t2 = t1" akan menyalin data dari t1 ke t2 sambil meninggalkan t1 dan t2 sebagai contoh berbeda), dan jika seseorang dapat hidup dengan quirks dalam penanganan jenis nilai .net menggunakan, sebuah struktur. Jika seseorang menginginkan semantik tipe nilai tetapi quirks .net akan menyebabkan rusaknya semantik tipe nilai dalam aplikasi seseorang, gunakan kelas dan bergumam.
sumber
Selain itu jawaban yang sangat baik di atas:
Struktur adalah tipe nilai.
Mereka tidak pernah dapat diatur ke Nothing .
Mengatur struktur = Tidak ada, akan mengatur semua jenis nilainya ke nilai standarnya.
sumber
ketika Anda tidak benar-benar membutuhkan perilaku, tetapi Anda membutuhkan lebih banyak struktur daripada array atau kamus sederhana.
Tindak lanjut Ini adalah bagaimana saya memikirkan struct secara umum. Saya tahu mereka dapat memiliki metode, tetapi saya suka menjaga perbedaan mental secara keseluruhan.
sumber
Seperti yang dikatakan @Simon, struct menyediakan semantik "nilai-tipe" jadi jika Anda memerlukan perilaku yang mirip dengan tipe data bawaan, gunakan struct. Karena struct dilewatkan melalui salinan, Anda ingin memastikan ukurannya kecil, sekitar 16 byte.
sumber
Ini adalah topik lama, tetapi ingin memberikan tes benchmark sederhana.
Saya telah membuat dua file .cs:
dan
Jalankan benchmark:
Hasil:
sumber
Hmm ...
Saya tidak akan menggunakan pengumpulan sampah sebagai argumen untuk / menentang penggunaan struct vs kelas. Tumpukan terkelola bekerja sangat mirip tumpukan - membuat objek hanya menempatkannya di atas tumpukan, yang hampir secepat mengalokasikan pada tumpukan. Selain itu, jika suatu objek berumur pendek dan tidak bertahan dari siklus GC, deallokasi bebas karena GC hanya bekerja dengan memori yang masih dapat diakses. (Cari MSDN, ada serangkaian artikel tentang manajemen memori .NET, saya terlalu malas untuk menggali untuk mereka).
Sebagian besar waktu saya menggunakan struct, saya akhirnya menendang diri saya untuk melakukannya, karena saya kemudian menemukan bahwa memiliki referensi semantik akan membuat segalanya lebih sederhana.
Bagaimanapun, keempat poin dalam artikel MSDN yang diposting di atas tampaknya merupakan pedoman yang baik.
sumber
class MutableHolder<T> { public T Value; MutableHolder(T value) {Value = value;} }
, dan kemudian sebuahMutableHolder<T>
akan menjadi objek dengan semantik kelas yang bisa berubah-ubah (ini berfungsi juga jika ituT
adalah struct atau tipe kelas yang tidak dapat diubah).Struct berada di Stack bukan Heap jadi oleh karena itu mereka thread aman, dan harus digunakan ketika menerapkan pola objek transfer, Anda tidak pernah ingin menggunakan objek di Heap mereka volatile, Anda ingin dalam hal ini menggunakan Call Stack, ini adalah kasus dasar untuk menggunakan struct saya terkejut dengan semua jalan keluar jawabannya di sini,
sumber
Saya pikir jawaban terbaik adalah dengan menggunakan struct ketika yang Anda butuhkan adalah kumpulan properti, kelas ketika itu adalah kumpulan properti DAN perilaku.
sumber