Mengapa DateTime. Bulan int?

9

Dalam C #, DateTimeproperti Monthmemiliki tipe int(integer bertanda 32 bit) namun jangkauannya hanya 1-12. Apa alasan tim C # memilih intlebih dari tipe numerik yang lebih kecil seperti byte(bilangan bulat 8 bit yang tidak ditandatangani)?

Frayt
sumber
5
Kecuali seseorang dari tim desain C # mengintai saya tidak yakin Anda akan mendapatkan jawaban untuk ini ...
Liath
1
@Liath itu tidak akan membantu saya takut, lihat Apakah bertanya "mengapa" pada spesifikasi bahasa masih dianggap sebagai "berbasis pendapat utama" jika dapat memiliki jawaban resmi? (kebetulan, penjelasan dari desainer bahasa C #)
nyamuk
Btw DateTimeseperti yang diterapkan dalam CoreFX mengkode waktu sebagai nilai 64 bit tunggal. Informasi seperti hari atau bulan diekstraksi dari nilai itu melalui beberapa matematika pintar ( GetDatePart()). Ini bukan alasan untuk menggunakan int sebagai nilai balik, itu hanya tidak memiliki kekurangan . Perhatikan juga bahwa karena masalah pelurusan, mengembalikan byte dari suatu fungsi tidak akan lebih efisien daripada mengembalikan int.
amon
3
Saya akan tergoda untuk bertanya mengapa ini bukan tipe yang dipanggil Month.
bdsl
Kemungkinan besar itu karena operasi yang dilakukan secara internal memerlukan int, dan perancang kompiler memutuskan bahwa tidak ada gunanya mengubahnya menjadi sesuatu yang lain, mungkin karena alasan kinerja.
NoChance

Jawaban:

23

intdigunakan untuk hampir semua variabel integer dalam. NET meskipun seringkali tipe yang lebih kecil sudah cukup. Juga, tipe unsigned hampir tidak pernah digunakan meskipun mereka bisa.

Beberapa alasan:

  1. Jenis yang ditandatangani dan tidak ditandatangani serta jenis bilangan bulat dengan ukuran yang berbeda dapat menjadi canggung saat menggabungkannya ( +atau <misalnya). Aturannya tidak jelas. Saya adalah pengembang yang berpengalaman dan saya tidak bisa memberi tahu Anda set lengkap aturan. Saya tidak perlu tahu.
  2. intcepat pada semua arsitektur umum. Jenis yang lebih kecil sering menghasilkan konversi yang lebih lambat.
  3. Performa bukan masalah bagi 99% kode biasa. Tidak perlu terlalu memikirkan ini. Cukup gunakan di intmana-mana.
  4. Keterbacaan sangat baik karena niatnya jelas. A byteakan menyarankan data biner misalnya. (Lihat komentar oleh Flater.)

Ini adalah konvensi yang bermanfaat untuk digunakan int.

usr
sumber
Terima kasih, ini adalah beberapa alasan bagus. Saya tidak pernah berpikir tentang implikasi kinerja konversi dari kecil ke besar atau tidak ditandatangani menjadi ditandatangani, karena itu semua tersirat dalam kode.
Frayt
Ya, saya benar-benar membuat kode lebih lambat satu kali dengan menggunakan byte alih-alih int, cukup gunakan ints; +)
Joel Harkes
1
Faktor lain mungkin bahwa "semua orang sebenarnya lebih suka int secara default" dan para desainer tidak menginginkan kejutan tipe ketidakcocokan.
SD
1
Menambah jawaban yang dinyatakan lengkap, keterbacaan adalah alasan lain untuk menggunakan int. Jika saya melihat byteproperti, saya tidak akan secara otomatis berpikir bahwa itu adalah nilai numerik. Satu byte bisa berupa banyak hal (mis. Koleksi boolean yang dipadatkan). Mendorong sedikit lebih jauh, saya ragu ada orang yang akan melihat byte[]dan berpikir untuk diri mereka sendiri "aha, itu harus dioptimalkan List<int>".
Flater
2
Butir 3 bertentangan dengan butir 2 dalam jawaban ini. Mungkin "titik 3" yang lebih baik adalah "Untuk 99% dari kode biasa, overhead memori" bulan sebagai int "vs" bulan sebagai byte "tidak menjadi masalah.
Doc Brown
4

Sebulan bukan nilai. Sebulan hanya sebulan.

1-12 pemetaan (yang seharusnya 0-11 imo) hanya dibuat untuk membuatnya lebih mudah untuk melakukan matematika dengannya.

Dan begitu Anda mulai berhitung dengan matematika, Anda harus pragmatis. Ints adalah default de facto untuk matematika integer. Jadi gunakan itu.

Itu yang diharapkan programmer. Tanpa konteks: mengharapkan int.

Karena Anda tidak tertarik apakah Januari adalah 1 (atau 0), Anda tertarik pada jawaban untuk pertanyaan seperti: "berapa banyak cicilan bulanan hingga saya membayar hutang ini". Dan kemudian Anda mengetahui bahwa Anda seharusnya menggunakan integer alih-alih byte.

Pieter B
sumber