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# 等效?的主要内容,如果未能解决你的问题,请参考以下文章