DragDropEffects.Scroll:为什么-2147483648不是8?

时间:2010-09-13 15:51:55

标签: c# .net com enums ole

System.Windows.Forms中的标准枚举:

[Flags]
public enum DragDropEffects
{
    Scroll = -2147483648,
    //
    // Summary:
    //     The combination of the System.Windows.DragDropEffects.Copy, System.Windows.Forms.DragDropEffects.Link,
    //     System.Windows.Forms.DragDropEffects.Move, and System.Windows.Forms.DragDropEffects.Scroll
    //     effects.
    All = -2147483645,
    None = 0,
    Copy = 1,
    Move = 2,
    Link = 4,
}

Scroll有一个奇怪的价值,你不觉得吗?

据我所知,这些价值都来自"the old times" of COM\OLE DROPEFFECT ......但他们为什么一开始就这样选择呢?作者是否试图保留8到0x80000000之间的间隔?它是以某种方式使用或是否有一个有趣的故事背后或它只是YAGNI原则的另一个长寿说明?

3 个答案:

答案 0 :(得分:1)

它是一个状态标志,与主要丢弃效果(复制/移动/链接)分开。离开房间以备将来的跌落效果时,选择高位允许一个技巧,例如检查值是否为负。与HRESULT或GetAsyncKeyState返回值相同的想法。

答案 1 :(得分:0)

是的,它看起来像某种“有趣”的黑客。常识会建议使用8,但也许有一些Windows版本相关的原因,为什么8不能使用,所以作者使用-2147483645(-0x80000000)代替。这不是 不正常的一个数字 - 无论谁编写它只是从高有效端而不是低有效端开始使用二进制'1'。

也许滚动在其他一组拖放效果中被认为是复制/移动/链接,因此作者希望将它放在单词的另一端,以及任何其他类似的不同效果。

也许在某个地方有一些可怕的逻辑来测试DragDropEffects变量是否大于零(意图是“任何不是非”的东西),而Scroll不应该落在那个范围内?

有点神秘。至少你认为他们会把常量放在十六进制中,以显示它不只是一些完全随机数。

答案 2 :(得分:0)

这样可以快速检查> 0以便知道是否正在调用复制,移动或链接。它不包括无以及滚动。