当前位置:  开发笔记 > 编程语言 > 正文

枚举定义中的波浪号(〜)是多少?

如何解决《枚举定义中的波浪号(〜)是多少?》经验,为你挑选了7个好方法。

我总是感到惊讶的是,即使在现在使用C#之后,我仍然设法找到我不知道的事情......

我试过在网上搜索这个,但在搜索中使用"〜"对我来说效果不好,我在MSDN上也找不到任何东西(不是说它不存在)

我最近看到了这段代码,代字号(〜)是什么意思?

/// 
/// Enumerates the ways a customer may purchase goods.
/// 
[Flags]
public enum PurchaseMethod
{   
    All = ~0,
    None =  0,
    Cash =  1,
    Check =  2,
    CreditCard =  4
}

我看到它有点惊讶所以我试图编译它,它有效...但我仍然不知道它意味着什么/做了什么.任何帮助?



1> Jimmy..:

〜是一元的补码运算符 - 它会翻转其操作数的位.

~0 = 0xFFFFFFFF = -1

在二进制补码算法中, ~x == -x-1

〜运算符几乎可以在任何借用C语法的语言中找到,包括Objective-C/C++/C#/ Java/Javascript.


@ Stevo3000:Int32.MinValue是0xF0000000,它不是〜0(它实际上是~Int32.MaxValue)

2> Sean Bright..:

我认为:

[Flags]
public enum PurchaseMethod
{
    None = 0,
    Cash = 1,
    Check = 2,
    CreditCard = 4,
    All = Cash | Check | CreditCard
 }

会更清楚一点.


除了个人偏好之外,如果OP的含义与OP和我一样清楚,那么他从来就不会提出这个问题.我不确定这说明一种方法与另一种方法的清晰度.
我不明白这是多么清楚.它增加了冗余或模糊性:"全部"是指"完全是这3个中的一组"还是"这个枚举中的所有内容"?如果我添加一个新值,我还应该将它添加到All吗?如果我看到其他人*没有*为All添加新值,那是故意的吗?〜0是明确的.
必然是.一元的唯一好处是如果有人添加枚举,All会自动包含它.不过,这种好处并不比缺乏清晰度更重要.
由于一些使用C#的程序员可能还不知道<<的意思,我们是否应该围绕它进行编码,以便更清晰?我想不是.
@Paul,那有点疯狂.让我们停止使用; 因为很多人不了解它的用法.或者他们不知道的那些话.哇,这么小的一组操作符,我们应该为那些不知道什么位以及如何操作它们的人愚弄我们的代码?
@InsidiousForce,这个有趣的故事,我前几天读了一篇文章,正是因为这个原因而正在提倡这种做法......

3> Johannes Sch..:
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的数字.


@configurator - 这不正确.补码是简单的比特反转.

4> blabla999..:

它比它好

All = Cash | Check | CreditCard

解决方案,因为如果您稍后添加其他方法,请说:

PayPal = 8 ,

你已经完成了波浪号 - 全部,但必须改变与另一个的全线.所以它以后不易出错.

问候



5> configurator..:

只是旁注,当你使用时

All = Cash | Check | CreditCard

你有额外的好处,Cash | Check | CreditCard可以评估,All而不是包含所有值时不等于所有值的另一个值(-1).例如,如果在UI中使用三个复选框

[] Cash
[] Check
[] CreditCard

并将它们的值相加,并且用户将它们全部选中,您将All在生成的枚举中看到它们.



6> Mike..:

对于其他发现这个问题的人来说,我有一个快速的~例子可以分享.如本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的答案相似吗?

我认为对我来说最重要的一点~就是它在枚举中与在正常的代码行中是相同的运算符.



7> missaghi..:

它是一个补码运算符,这是我经常提到的用于按位运算符的文章

http://www.blackwasp.co.uk/CSharpLogicalBitwiseOps.aspx

msdn也在他们的枚举文章中使用它,证明它使用得更好

http://msdn.microsoft.com/en-us/library/cc138362.aspx

推荐阅读
mobiledu2402851203
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有