如何对Windows API常量进行分组

7

在定义Windows API常量值时,将它们定义为const是否更好?

public const int SW_HIDE = 0;
public const int SW_SHOWNORMAL = 1;
public const int SW_NORMAL = 1;
public const int SW_SHOWMINIMIZED = 2;
public const int SW_SHOWMAXIMIZED = 3;
public const int SW_MAXIMIZE = 3;
public const int SW_SHOWNOACTIVATE = 4;
public const int SW_SHOW = 5;
public const int SW_MINIMIZE = 6;
public const int SW_SHOWMINNOACTIVE = 7;
public const int SW_SHOWNA = 8;
public const int SW_RESTORE = 9;
public const int SW_SHOWDEFAULT = 10;
public const int SW_MAX = 10;

[DllImport( "user32.dll" )]
public static extern bool ShowWindow( HandleRef hWnd, int nCmdShow );

或将它们作为枚举类型进行分组。

public enum SW {
  SW_HIDE = 0,
  SW_SHOWNORMAL = 1,
  SW_NORMAL = 1,
  SW_SHOWMINIMIZED = 2,
  SW_SHOWMAXIMIZED = 3,
  SW_MAXIMIZE = 3,
  SW_SHOWNOACTIVATE = 4,
  SW_SHOW = 5,
  SW_MINIMIZE = 6,
  SW_SHOWMINNOACTIVE = 7,
  SW_SHOWNA = 8,
  SW_RESTORE = 9,
  SW_SHOWDEFAULT = 10,
  SW_MAX = 10
}

[DllImport( "user32.dll" )]
public static extern bool ShowWindow( HandleRef hWnd, SW nCmdShow );

我更喜欢你展示的enum版本,但是名称上不需要冗余的前缀:public enum SW { HIDE = 0, SHOWNORMAL = 1 ... etc.。至少要遵循DRY原则,消除(可能存在的)一整类错误或混淆(SW.SX_MODE == ???)。 - Glenn Slayden
2个回答

6

将它们分组为枚举。

为什么?整数在各个地方都被使用,例如,在需要大小的地方也可以传递它们。这导致了匈牙利命名法(szSomething..)的出现。类型系统缺失,他们试图使用变量命名方案来“修复”它。现在你有了一个更好的类型系统,应该使用它。

定义枚举,以合理的方式对它们进行分组,这样你就不会有 Thread.Sleep(WM_User) 的一天(是的,我用这个例子并不完全认真,但我想你明白我的意思)。


5

除了代码可维护性外,这并不重要。

我建议使用一个enum;这允许您在调用函数时使用IntelliSense,并可以帮助防止错误。
但是,您应该为枚举赋予一个有意义的名称,例如WindowShowType
此外,您可能需要删除前缀,并可能将名称标准化为CamelCase。


虽然我同意去掉前缀,但我更喜欢保留Win32中的全大写名称,而不是像你建议的那样将它们转换为TitleCase(我通常将术语camelCase保留给刚刚展示的形式)。我的理由是前者的改变有一个原则性的动机(请参见我在此页面上的其他评论),而后者似乎更加无谓,甚至可能会丢失关于枚举的Win32来源的信息,尽管这是间接的。 - Glenn Slayden

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接