Mengapa orang selalu menggunakan nilai enum suka 0, 1, 2, 4, 8
dan tidak 0, 1, 2, 3, 4
?
Apakah ini ada hubungannya dengan operasi bit, dll?
Saya akan sangat menghargai cuplikan sampel kecil tentang bagaimana ini digunakan dengan benar :)
[Flags]
public enum Permissions
{
None = 0,
Read = 1,
Write = 2,
Delete = 4
}
c#
permissions
enums
flags
Pascal
sumber
sumber
|
(dan&
) mewakili. Berbagai jawaban menganggap Anda sudah terbiasa dengannya.Jawaban:
Karena mereka adalah kekuatan dua dan saya dapat melakukan ini:
Dan mungkin nanti ...
Ini adalah bidang bit, di mana setiap set bit sesuai dengan beberapa izin (atau apa pun nilai yang disebutkan secara logis sesuai dengan). Jika ini didefinisikan sebagai
1, 2, 3, ...
Anda tidak akan dapat menggunakan operator bitwise dengan cara ini dan mendapatkan hasil yang bermakna. Untuk menggali lebih dalam ...Perhatikan polanya di sini? Sekarang jika kita mengambil contoh asli saya, yaitu,
Kemudian...
Lihat? Baik bit
Read
danWrite
sudah diatur, dan saya bisa memeriksanya secara independen (Perhatikan juga bahwaDelete
bit tidak diatur dan karena itu nilai ini tidak memberikan izin untuk menghapus).Hal ini memungkinkan seseorang untuk menyimpan beberapa flag dalam satu bidang bit.
sumber
myEnum.IsSet
. Saya berpendapat bahwa ini adalah abstraksi yang sama sekali tidak berguna dan hanya berfungsi untuk mengurangi pengetikan, tetapi mehFlags
atribut tidak lebih dari memberi Anda 'pencetakan cantik' iirc. Anda dapat menggunakan nilai yang disebutkan sebagai bendera terlepas dari keberadaan atribut.0
bukanfalse
;false
adalahfalse
. Namun Anda bisa menulisif((permissions & Permissions.Write) > 0)
.(permissions & Permissions.Write) == Permissions.Write
, Anda sekarang dapat menggunakanenum.HasFlag()
Jika masih tidak jelas dari jawaban lain, pikirkan seperti ini:
hanyalah cara yang lebih singkat untuk menulis:
Ada delapan kemungkinan tetapi Anda dapat mewakili mereka sebagai kombinasi dari hanya empat anggota. Jika ada enam belas kemungkinan maka Anda dapat mewakili mereka sebagai kombinasi dari hanya lima anggota. Jika ada empat miliar kemungkinan maka Anda dapat mewakili mereka sebagai kombinasi dari hanya 33 anggota! Jelas jauh lebih baik untuk memiliki hanya 33 anggota, masing-masing (kecuali nol) kekuatan dua, daripada mencoba menyebutkan empat miliar item dalam enum.
sumber
enum
dengan empat miliar anggota. Dan bagian yang menyedihkan adalah, mungkin seseorang di luar sana telah mencobanya.2 ** -infinity
sebagai kekuatan dua).Karena nilai-nilai ini mewakili lokasi bit unik dalam biner:
dll
EDIT:
3 dalam biner diwakili oleh nilai 1 di kedua tempat dan dua tempat. Ini sebenarnya sama dengan nilainya
1 | 2
. Jadi ketika Anda mencoba menggunakan tempat biner sebagai bendera untuk mewakili beberapa keadaan, 3 biasanya tidak bermakna (kecuali ada nilai logis yang sebenarnya adalah kombinasi keduanya)Untuk klarifikasi lebih lanjut, Anda mungkin ingin memperluas contoh enum Anda sebagai berikut:
Oleh karena itu dalam saya punya
Permissions.All
, saya juga secara implisit memilikiPermissions.Read
,Permissions.Write
, danPermissions.Delete
sumber
3
adalah11
biner, yaitu, tidak peta untuk satu set bit tunggal, sehingga Anda kehilangan kemampuan untuk memetakan 1 bit dalam posisi sewenang-wenang untuk nilai yang berarti.2|3 == 1|3 == 1|2 == 3
,. Jadi jika Anda memiliki nilai dengan biner00000011
, dan bendera Anda termasuk nilai-nilai1
,2
dan3
, maka Anda tidak akan tahu apakah nilai yang mewakili1 and 3
,2 and 3
,1 and 2
atauonly 3
. Itu membuatnya jauh kurang berguna.Saya pikir menulis seperti ini lebih mudah dimengerti dan dibaca, dan Anda tidak perlu menghitungnya.
sumber
Ini digunakan untuk mewakili flag bit yang memungkinkan kombinasi nilai enum. Saya pikir ini lebih jelas jika Anda menulis nilai dalam notasi hex
sumber
4194304
dengan 2? Bagaimana dengan0x400000
? Ini jauh lebih mudah untuk dikenali0x800000
sebagai jawaban yang benar daripada8388608
, dan juga lebih mudah untuk mengetik nilai hex.0x10000
kekuatan dua? Ya, itu dimulai dengan 1, 2, 4, atau 8 dan memiliki semua 0 setelahnya. Anda tidak perlu menerjemahkan secara mental 0x10 ke 16 (meskipun hal itu mungkin akan menjadi kebiasaan kedua pada akhirnya), anggap saja sebagai, "beberapa kekuatan 2".Ini benar-benar lebih dari sebuah komentar, tetapi karena itu tidak akan mendukung pemformatan, saya hanya ingin memasukkan metode yang telah saya gunakan untuk menyiapkan enumerasi bendera:
Saya menemukan pendekatan ini sangat membantu selama pengembangan dalam kasus di mana Anda ingin menjaga bendera Anda dalam urutan abjad. Jika Anda menentukan Anda perlu menambahkan nilai bendera baru, Anda bisa memasukkannya secara abjad dan satu-satunya nilai yang harus Anda ubah adalah yang sekarang mendahului.
Namun, perlu diketahui bahwa begitu suatu solusi diterbitkan untuk sistem produksi apa pun (terutama jika enum terbuka tanpa sambungan ketat, seperti melalui layanan web), maka sangat disarankan untuk tidak mengubah nilai apa pun yang ada dalam enum.
sumber
Banyak jawaban yang bagus untuk yang satu ini ... Saya hanya akan mengatakan .. jika Anda tidak suka, atau tidak dapat dengan mudah memahami apa yang
<<
sintaks coba katakan .. Saya pribadi lebih suka alternatif (dan berani saya katakan, gaya deklarasi enum langsung ) ...LOG 513 == 513
Jauh lebih mudah (setidaknya bagi saya sendiri) untuk memahaminya. Sejajarkan yang ... jelaskan hasil yang Anda inginkan, dapatkan hasil yang Anda INGIN .. Tidak perlu "perhitungan".
sumber