Saya selalu terkejut bahwa bahkan setelah menggunakan C # selama ini sekarang, saya masih dapat menemukan hal-hal yang tidak saya ketahui tentang ...
Saya sudah mencoba mencari di internet untuk ini, tetapi menggunakan "~" dalam pencarian tidak bekerja dengan baik untuk saya dan saya tidak menemukan apa pun di MSDN (tidak untuk mengatakan itu tidak ada)
Saya melihat potongan kode ini baru-baru ini, apa artinya tilde (~)?
/// <summary>
/// Enumerates the ways a customer may purchase goods.
/// </summary>
[Flags]
public enum PurchaseMethod
{
All = ~0,
None = 0,
Cash = 1,
Check = 2,
CreditCard = 4
}
Saya sedikit terkejut melihatnya jadi saya mencoba mengkompilasinya, dan berhasil ... tapi saya masih tidak tahu apa artinya / tidak. Ada bantuan ??
c#
enums
language-features
enumeration
Hugoware
sumber
sumber
Jawaban:
~ adalah operator komplemen unary - membalik bit operan.
dalam aritmatika komplemen dua,
~x == -x-1
operator ~ dapat ditemukan dalam hampir semua bahasa yang meminjam sintaksis dari C, termasuk Objective-C / C ++ / C # / Java / Javascript.
sumber
Saya akan berpikir bahwa:
Akan sedikit lebih jelas.
sumber
Karena dua komplemen dalam C #,,
~0 == -1
angka di mana semua bit adalah 1 dalam representasi biner.sumber
Lebih baik daripada
solusi, karena jika Anda menambahkan metode lain nanti, katakan:
Anda sudah selesai dengan tilde-All, tetapi harus mengubah semua-line dengan yang lain. Jadi lebih sedikit kesalahannya nanti.
salam
sumber
Hanya catatan tambahan, saat Anda menggunakannya
Anda memiliki manfaat tambahan yang
Cash | Check | CreditCard
akan dievaluasi keAll
dan bukan ke nilai lain (-1) yang tidak sama dengan semua saat berisi semua nilai. Misalnya, jika Anda menggunakan tiga kotak centang di UIdan menjumlahkan nilainya, dan pengguna memilih semuanya, Anda akan melihat
All
dalam hasil enum.sumber
myEnum.HasFlag()
sebagai gantinya: DAll.HasFlag(Cash | Check | CreditCard)
dan itu akan terevolusi menjadi true. Akan menjadi solusi karena==
tidak selalu bekerja dengan ~ 0.ToString
- bukan tentang menggunakan== All
.Untuk orang lain yang menemukan pertanyaan ini menerangi, saya punya
~
contoh cepat untuk dibagikan. Cuplikan berikut dari penerapan metode cat, sebagaimana dirinci dalam dokumentasi Mono ini , menggunakan~
efek luar biasa:Tanpa
~
operator, kodenya mungkin akan terlihat seperti ini:... karena enumerasi terlihat seperti ini:
Perhatikan kesamaan enum ini dengan jawaban Sean Bright?
Saya pikir yang paling penting untuk saya adalah
~
operator yang sama dalam enum seperti pada baris kode normal.sumber
&
s menjadi|
s?Ini adalah operator pelengkap, Ini adalah artikel yang sering saya lihat untuk operator bitwise
http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx
Juga msdn menggunakannya dalam artikel enums mereka yang menunjukkan penggunaannya yang lebih baik
http://msdn.microsoft.com/en-us/library/cc138362.aspx
sumber
Alternatif yang saya gunakan secara pribadi, yang melakukan hal yang sama dari jawaban @Sean Bright tetapi terlihat lebih baik bagi saya, adalah yang ini:
Perhatikan bagaimana sifat biner angka-angka, yang semua kekuatan dari dua, membuat pernyataan berikut benar:
(a + b + c) == (a | b | c)
. Dan IMHO,+
terlihat lebih baik.sumber
Saya telah melakukan beberapa percobaan dengan ~ dan menemukan itu bisa memiliki jebakan. Pertimbangkan potongan ini untuk LINQPad yang menunjukkan bahwa nilai Semua enum tidak berperilaku seperti yang diharapkan ketika semua nilai diurutkan bersama.
sumber
Hanya ingin menambahkan, jika Anda menggunakan [Bendera] enum, maka mungkin lebih nyaman untuk menggunakan operator shift kiri bitwise, seperti ini:
sumber