【问题标题】:DragDropEffects.Scroll: why -2147483648 not 8?DragDropEffects.Scroll:为什么 -2147483648 不是 8?
【发布时间】:2011-04-11 18:02:24
【问题描述】:

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 原则的另一个长期例证?

【问题讨论】:

    标签: c# .net com enums ole


    【解决方案1】:

    它是一个状态标志,与主要的掉落效果(复制/移动/链接)分开。除了为未来的下降效果留出空间之外,选择高位允许像检查值是否为负这样的技巧。与 HRESULT 或 GetAsyncKeyState 返回值的想法相同。

    【讨论】:

    • 负值和 HRESULT 有什么技巧?我想我不记得了... =(
    • 如果小于零则调用失败。这就是 FAILED(hr) 宏的作用。
    【解决方案2】:

    是的,它看起来像是某种“有趣”的 hack。常识会建议使用8,但可能有一些Windows版本相关的原因导致无法使用8,因此作者使用-2147483645(-0x80000000)代替。 不是一个不寻常的数字 - 编写它的人只是从高有效端而不是低有效端的二进制“1”开始。

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

    也许某处有一些糟糕的逻辑需要测试,以查看 DragDropEffects 变量是否大于零(意为“任何非无”),并且 Scroll 不应落在该范围内?

    有点神秘。至少您会认为他们会将常量以十六进制形式输入,以表明它不仅仅是一些完全随机数。

    【讨论】:

    • 以十进制还是十六进制显示是所使用的反编译器选项的结果,并且不会告诉您有关原始源代码的任何信息。
    【解决方案3】:

    这允许快速检查 > 0 以了解是否正在调用复制、移动或链接。它不包括 None 以及 Scroll。

    【讨论】:

      猜你喜欢
      • 2012-09-19
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 2020-08-20
      • 2017-07-16
      • 1970-01-01
      • 2012-06-29
      相关资源
      最近更新 更多