gpt4 book ai didi

c# - C/C++ 与 C# 的互操作性命名约定

转载 作者:IT老高 更新时间:2023-10-28 23:20:16 26 4
gpt4 key购买 nike

考虑以下 Win32 API 结构:

typedef struct _SECURITY_ATTRIBUTES {
DWORD nLength;
LPVOID lpSecurityDescriptor;
BOOL bInheritHandle;
} SECURITY_ATTRIBUTES, *PSECURITY_ATTRIBUTES, *LPSECURITY_ATTRIBUTES;

当将此对象移植到 C# 时,我是否应该遵循此处使用的名称命名约定,如下所示:

public struct _SECURITY_ATTRIBUTES
{
public int nLength;
public unsafe byte* lpSecurityDescriptor;
public int bInheritHandle;
}

或者我可以全力以赴,用 C# 风格编写我的结构,如下所示:

public struct SecurityAttributes
{
private int length;
private unsafe byte* securityDescriptor;
private int bInheritHandle;

public Int32 Length
{
get { return this.length; }
set { this.length = value; }
}

public Byte* SecurityDescriptor
{
get { return this.seurityDescriptor; }
set { this.securityDescriptor = value; }
}

public Int32 InheritHandle
{
get { return this.bInheritHandle; }
set { this.bInheritHandle = value; }
}

public SecurityAttributes(int length, byte* securityDescriptor, int inheritHandle)
{
this.length = length;
this.securityDescriptor = securityDescriptor;
this.inheritHandle = inheritHandle;
}
}

虽然第二种方法看起来更优雅,但我想知道是否建议使用以这种方式编写的结构调用 native 功能,或者从 C/C++ 移植结构时是否存在任何其他陷阱。

最佳答案

这取决于您的个人喜好。您选择哪种方法的主要考虑因素应该是易于代码维护。就我个人而言,我倾向于坚持使用与 C 声明中使用的名称完全相同的名称,因为这样更容易理解我在看什么。例如,如果我这样定义一个结构:

/// <summary>
/// Unmanaged sockaddr_in structure from Ws2def.h.
/// </summary>
[StructLayoutAttribute(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct sockaddr_in
{
/// <summary>
/// short sa_family;
/// </summary>
public short sa_family;

/// <summary>
/// unsigned short sin_port;
/// </summary>
public ushort sin_port;

/// <summary>
/// struct in_addr addr;
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 4)]
public byte[] addr;

/// <summary>
/// char sin_zero[8];
/// </summary>
[MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.I1, SizeConst = 8)]
public byte[] sin_zero;
}

然后我或同事想知道 sa_family 到底是什么,我们可以搜索有关 sa_family 的文档。如果我有一个 Family 属性,我将有一个额外的步骤来确定它映射到 sa_family。

当然,我可以将命名良好的 getter 和 setter 放在结构上,例如 public short Family... 但是,我尝试将互操作结构和方法隐藏在更易于使用的后面界面。似乎没有必要扩展低级互操作定义。

关于c# - C/C++ 与 C# 的互操作性命名约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13957362/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com