我总是感到惊讶的是,即使在现在使用C#之后,我仍然设法找到我不知道的事情......
我试过在网上搜索这个,但在搜索中使用"〜"对我来说效果不好,我在MSDN上也找不到任何东西(不是说它不存在)
我最近看到了这段代码,代字号(〜)是什么意思?
////// Enumerates the ways a customer may purchase goods. /// [Flags] public enum PurchaseMethod { All = ~0, None = 0, Cash = 1, Check = 2, CreditCard = 4 }
我看到它有点惊讶所以我试图编译它,它有效...但我仍然不知道它意味着什么/做了什么.任何帮助?
〜是一元的补码运算符 - 它会翻转其操作数的位.
~0 = 0xFFFFFFFF = -1
在二进制补码算法中, ~x == -x-1
〜运算符几乎可以在任何借用C语法的语言中找到,包括Objective-C/C++/C#/ Java/Javascript.
我认为:
[Flags] public enum PurchaseMethod { None = 0, Cash = 1, Check = 2, CreditCard = 4, All = Cash | Check | CreditCard }
会更清楚一点.
public enum PurchaseMethod { All = ~0, // all bits of All are 1. the ~ operator just inverts bits None = 0, Cash = 1, Check = 2, CreditCard = 4 }
由于C#中的两个补码~0 == -1
,所以二进制表示中所有位都为1的数字.
它比它好
All = Cash | Check | CreditCard
解决方案,因为如果您稍后添加其他方法,请说:
PayPal = 8 ,
你已经完成了波浪号 - 全部,但必须改变与另一个的全线.所以它以后不易出错.
问候
只是旁注,当你使用时
All = Cash | Check | CreditCard
你有额外的好处,Cash | Check | CreditCard
可以评估,All
而不是包含所有值时不等于所有值的另一个值(-1).例如,如果在UI中使用三个复选框
[] Cash [] Check [] CreditCard
并将它们的值相加,并且用户将它们全部选中,您将All
在生成的枚举中看到它们.
对于其他发现这个问题的人来说,我有一个快速的~
例子可以分享.如本Mono文档中详述的那样,执行paint方法的以下片段使用~
效果很好:
PaintCells (clipBounds, DataGridViewPaintParts.All & ~DataGridViewPaintParts.SelectionBackground);
没有~
运算符,代码可能看起来像这样:
PaintCells (clipBounds, DataGridViewPaintParts.Background | DataGridViewPaintParts.Border | DataGridViewPaintParts.ContentBackground | DataGridViewPaintParts.ContentForeground | DataGridViewPaintParts.ErrorIcon | DataGridViewPaintParts.Focus);
...因为枚举看起来像这样:
public enum DataGridViewPaintParts { None = 0, Background = 1, Border = 2, ContentBackground = 4, ContentForeground = 8, ErrorIcon = 16, Focus = 32, SelectionBackground = 64, All = 127 // which is equal to Background | Border | ... | Focus }
注意这个枚举与Sean Bright的答案相似吗?
我认为对我来说最重要的一点~
就是它在枚举中与在正常的代码行中是相同的运算符.
它是一个补码运算符,这是我经常提到的用于按位运算符的文章
http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx
msdn也在他们的枚举文章中使用它,证明它使用得更好
http://msdn.microsoft.com/en-us/library/cc138362.aspx