C++ ULONG 定义为 VB.NET 还是 C# 等效?

Posted

技术标签:

【中文标题】C++ ULONG 定义为 VB.NET 还是 C# 等效?【英文标题】:C++ ULONG definitions to VB.NET or C# equivalent? 【发布时间】:2009-03-16 12:40:01 【问题描述】:

我正在尝试通过套接字使用通话记录 API。我们有 API 文档,但示例都是用 C++ 编写的。

如何在 VB.NET 或 C# 中声明以下内容?

#define SIF_GENERAL 0x08000000
#define SIF_CONFIGURATION 0x08010000
#define SIF_ARCHIVE 0x08020000
#define SIF_SEARCH 0x08030000
#define SIF_REPLAY 0x08040000
#define SIF_STATISTICS 0x08050000
#define SIF_ENGINEER 0x08060000

文档中的注释:消息标识符是无符号的 32 位值 (ULONG)。

【问题讨论】:

【参考方案1】:

VB.NET

Module Constants
  Public Const SIF_GENERAL as Integer =&H08000000
  Public Const SIF_CONFIGURATION As Integer = &H08010000
  Public Const SIF_ARCHIVE As Integer = &H08020000
  Public Const SIF_SEARCH As Integer = &H08030000
  Public Const SIF_REPLAY As Integer = &H08040000
  Public Const SIF_STATISTICS As Integer = &h08050000
  Public Const SIF_ENGINEER As Integer = &h08060000

End Module

C#

public static class Constants 
  public const int SIF_GENERAL =0x08000000;
  public const int SIF_CONFIGURATION = 0x08010000;
  public const int SIF_ARCHIVE = 0x08020000;
  public const int SIF_SEARCH = 0x08030000;
  public const int SIF_REPLAY = 0x08040000;
  public const int SIF_STATISTICS = 0x08050000;
  public const int SIF_ENGINEER = 0x08060000;

【讨论】:

【参考方案2】:

您可以使用枚举使值看起来更像 .NETty:

//C#
public enum SIF : uint

    SIF_GENERAL = 0x08000000,
    SIF_CONFIGURATION = 0x08010000,
    SIF_ARCHIVE = 0x08020000,
    SIF_SEARCH = 0x08030000,
    SIF_REPLAY = 0x08040000,
    SIF_STATISTICS = 0x08050000,
    SIF_ENGINEER = 0x08060000,

'VB.NET
Public Enum SIF As UInt32
    SIF_GENERAL = &H08000000
    SIF_CONFIGURATION = &H08010000
    SIF_ARCHIVE = &H08020000
    SIF_SEARCH = &H08030000
    SIF_REPLAY = &H08040000
    SIF_STATISTICS = &H08050000
    SIF_ENGINEER = &H08060000
End Enum

通过这种方式,您可以获得枚举的可发现性和类型安全性(除了通过接口传递它们的地方,您需要在其中强制转换它们)。

您甚至可以通过重命名它们来增加 .NET 的外观 - 例如,SIF.SIF_GENERAL 可以变为 SIF.General,尽管优势很小。

【讨论】:

【参考方案3】:

C++ ULONG 是 32 位无符号整数类型。在这种情况下,您的常量不需要无符号,因此只需在 C# 中使用 int 或在 VB.NET 中使用 Integer。

VB.NET

Public Const SIF_GENERAL as Integer = &H08000000

C#

public const int SIF_GENERAL = 0x08000000;

不要使用 64 位长数据类型,因为数据大小对于您的 API 调用来说是不正确的。

【讨论】:

【参考方案4】:

如果您有 >= 0x8000000 的常量,那么您可以这样定义它们:

class Test

   public const int AllBits = unchecked((int)0xFFFFFFFF);
   public const int HighBit = unchecked((int)0x80000000);

See this MSDN article on unchecked.

【讨论】:

以上是关于C++ ULONG 定义为 VB.NET 还是 C# 等效?的主要内容,如果未能解决你的问题,请参考以下文章

vb c c++,c# vb.net到底啥区别

VB.net 和C#.net 各有啥优缺点

VB.NET 根据所选文化格式化数字

为啥vb.net用的人这么少,而C#.net用的人那么多呢?

将模板类从 C++ 库导出到 VB.NET 和 C#

VB.Net/C# - 在自定义函数上拆分字符串