Saya memahami perbedaan dalam kapasitas dan nilai-nilai yang dapat mereka wakili, tetapi sepertinya orang selalu menggunakan Int32
terlepas dari apakah itu sesuai atau tidak. Tidak seorang pun tampaknya menggunakan versi yang tidak ditandatangani ( uint
) meskipun banyak waktu yang cocok karena menggambarkan nilai yang tidak boleh negatif (mungkin untuk mewakili ID dari catatan basis data). Juga, tidak ada yang tampaknya menggunakan short/Int16
terlepas dari kapasitas nilai yang diperlukan.
Secara objektif, apakah ada kasus-kasus di mana lebih baik digunakan uint
atau short/Int16
dan jika ya, yang mana?
null
dari positif atau negatif. Jika Anda menganggapnya sebagai sesuatu yang tidak pernah bisa negatif atau selalu positif, Anda akan terkejut (dan sering marah) pada hasilnya karena itu tidak benar-benar bekerja seperti itu, terutama jika dibandingkan dengan atau dikurangi dengan / dari nilai yang ditandatangani.Jawaban:
Saya menduga Anda mengacu pada perspektif yang diwarnai oleh pengalaman Anda sendiri di mana Anda belum bekerja di sekitar orang-orang yang menggunakan tipe integral dengan benar. Ini mungkin kejadian biasa, tetapi sudah menjadi pengalaman saya bahwa orang-orang juga menggunakannya dengan benar.
Manfaatnya adalah ruang memori dan waktu cpu, mungkin juga ruang IO tergantung pada apakah jenisnya pernah dikirim melalui kabel atau ke disk. Jenis yang tidak ditandatangani memberi Anda pemeriksaan kompiler untuk memastikan Anda tidak akan melakukan operasi tertentu yang tidak mungkin, ditambah memperluas rentang yang tersedia sambil mempertahankan ukuran yang lebih kecil untuk kinerja yang lebih tinggi di mana mungkin diperlukan.
Penggunaan yang benar adalah seperti yang Anda harapkan - kapan pun Anda tahu pasti Anda dapat menggunakannya secara permanen (jangan membatasi tanpa kepastian atau Anda akan menyesal nanti).
public uint NumberOfPeople
) gunakan tipe yang tidak ditandatangani.public byte DamagedToothCount
), gunakan byte.public short JimmyHoffasBankBalance
).public int HoursSinceUnixEpoch
).public long MyReallyGreatAppsUserCountThisIsNotWishfulThinkingAtAll
).Alasan ini dapat digunakan di seluruh dalam memilih antara ukuran yang ditanda tangani, tidak ditandatangani, dan beragam jenis, hanya berpikir tentang kebenaran logis dari data yang Anda wakili dalam kenyataan.
sumber
int
mana - mana kecuali Anda tahu fakta bahwa domain masalah sebenarnya membatasi nilai - tidak ada bank yang ingin membatasi akun dengan keras hingga 33 ribu pound (dan memikirkan kesenangannya) ketika itu meluap ...!).long
. Penghematan memori tentu saja secara tidak langsung dapat menghemat waktu dengan meningkatkan efisiensi cache-line dan sebagainya, tetapi OTOH masalah penyelarasan dengan tipe kecil dapat secara tidak langsung menghabiskan waktu.Tentu, ada beberapa kasus di mana lebih baik menggunakan
uint
ataushort
atauInt16
. Ketika Anda tahu bahwa rentang data Anda akan cocok dengan batasan tipe variabel itu, maka boleh saja menggunakan tipe itu.Dalam lingkungan yang terbatas ingatan atau ketika berhadapan dengan sejumlah besar objek, masuk akal untuk menggunakan variabel ukuran terkecil. Misalnya, ada perbedaan ukuran yang signifikan untuk satu juta elemen array
int
s vs.short
s.Seringkali, itu tidak terjadi dalam kode aktual karena satu atau lebih alasan berikut:
Ada banyak alasan yang lebih mungkin, tetapi mereka sampai pada ini: Waktu yang terlibat dalam memutuskan dan menggunakan tipe variabel yang berbeda tidak memberikan manfaat yang cukup untuk membenarkan melakukannya.
sumber
Dalam C, dalam konteks yang tidak melibatkan promosi bilangan bulat , nilai yang tidak ditandai ditetapkan untuk berperilaku sebagai anggota dari cincin aljabar abstrak "pembungkus" (jadi untuk X dan Y, XY akan menghasilkan nilai unik yang, ketika ditambahkan ke Y, akan menghasilkan X ), ketika tipe integer yang ditandatangani ditentukan sebagai berperilaku seperti integer ketika perhitungan berada dalam kisaran tertentu, dan diizinkan untuk melakukan apa saja ketika perhitungan melampaui itu. Namun, semantik numerik dalam C # benar-benar berbeda. Ketika dalam konteks numerik yang dicentang, kedua tipe yang ditandatangani dan tidak bertanda berperilaku seperti bilangan bulat asalkan komputasi tetap berada dalam jangkauan, dan melempar
OverflowException
ketika tidak; dalam konteks yang tidak dicentang, keduanya berperilaku seperti cincin aljabar.Satu-satunya waktu yang secara umum bermanfaat untuk menggunakan tipe data yang lebih kecil dari pada
Int32
saat diperlukan untuk mengemas atau membongkar barang untuk penyimpanan atau transportasi yang ringkas. Jika seseorang perlu menyimpan setengah miliar angka positif, dan mereka semua akan berada dalam kisaran 0 hingga 100, menggunakan masing-masing satu byte daripada empat akan menghemat 1,5 gigabytes penyimpanan. Itu penghematan besar. Jika sepotong kode perlu menyimpan total beberapa ratus nilai, bagaimanapun, membuat masing-masing satu byte daripada empat akan menghemat sekitar 600 byte. Mungkin tidak layak untuk diganggu.Berkenaan dengan jenis yang tidak ditandatangani, satu-satunya waktu mereka benar-benar berguna adalah ketika melakukan pertukaran informasi, atau ketika membagi angka menjadi beberapa bagian. Jika, misalnya, seseorang perlu melakukan matematika pada bilangan bulat 96-bit, kemungkinan akan lebih mudah untuk melakukan perhitungan pada kelompok tiga bilangan bulat 32 bit yang tidak ditandatangani, daripada pada kelompok bilangan bulat yang ditandatangani. Kalau tidak, tidak ada banyak situasi di mana kisaran nilai 32- atau 64-bit yang ditandatangani tidak memadai, tetapi ukuran yang sama dari nilai yang tidak ditandatangani akan cukup.
sumber
Biasanya merupakan ide yang buruk untuk menggunakan tipe yang tidak ditandatangani karena mereka meluap dengan cara yang tidak menyenangkan.
x = 5-6
tiba-tiba bom waktu dalam kode Anda. Sementara itu manfaat dari tipe-tipe yang tidak ditandatangani mendidih menjadi satu ketelitian ekstra, dan jika bit itu sepadan untuk Anda, Anda hampir pasti akan menggunakan tipe yang lebih besar sebagai gantinya.Ada kasus penggunaan di mana jenis yang lebih kecil bisa masuk akal, tetapi kecuali jika Anda khawatir tentang penggunaan memori atau perlu mengemas data untuk efisiensi pengiriman atau cache atau beberapa masalah lain, biasanya hal itu tidak ada gunanya menggunakan jenis yang lebih kecil. . Selain itu, pada banyak arsitektur, sebenarnya lebih lambat untuk menggunakan jenis ini sehingga mereka dapat benar-benar mengenakan biaya yang kecil.
sumber
i+1>i
ke1
jikai
ditandatangani, bersama dengan sejumlah perilaku jahat lainnya. Overflow yang tidak ditandatangani dapat menyebabkan bug di kasing sudut. Overflow yang ditandatangani dapat membuat seluruh program Anda tidak berarti .Sering dilupakan dan mungkin bersinggungan dengan pertanyaan Anda, ketika berhadapan secara khusus dengan tipe .NET, adalah Kepatuhan CLS . Tidak semua jenis tersedia untuk semua bahasa yang dibangun di .NET Framework.
Jika Anda menulis kode untuk dikonsumsi oleh bahasa selain C # dan ingin agar kode tersebut dijamin untuk beroperasi dengan sebanyak mungkin. NET bahasa, maka Anda harus membatasi penggunaan jenis Anda ke bahasa yang sesuai dengan CLS.
Misalnya, versi awal VB.NET (7.0 dan 7.1) tidak mendukung bilangan bulat yang tidak ditandatangani (
UInteger
):Bilangan bulat yang tidak ditandatangani tidak sesuai dengan CLS dan karenanya harus digunakan dengan hati-hati jika Anda tidak yakin siapa pengguna perpustakaan kelas Anda.
sumber