C/C++ 与 C# 常用数据类型对比
在C# 调用C/C++ DLL 或C/C++ 调用C#回调函数时,经常涉及到一些常用的数据类型。有些数据类型,在两者中的数据长度不一致,下面将对一些常用的数据类型进行下对比。
| 非托管C语言类型 | C# 类型 | 说明 |
|---|---|---|
| char | System.Char | ANSI 修饰 |
| unsigned char | System.Byte | 8位 |
| short | System.Int16 | 16位 |
| unsigned short | System.UInt16 | 16位 |
| int | System.Int32 | 32位 |
| unsigned int | System.UInt32 | 32位 |
| long | System.Int32 | 32位 |
| unsigned long | System.UInt32 | 32位 |
| float | System.Single | 32位 |
| double | System.Double | 32位 |
char与字符串
关于char在实际开发中,如果表示字符,在C#则用System.Char类型;如果表示有符号整型,可用sbyte,无符号可用byte。
查看C#中关于sbyte与byte的定义,可以看到:sbyte的取值范围。

同样查看byte:取值范围为0-255。因此,可根据实际开发情况选择合适数据类型。

当用到字符串char* 时,可以用System.String 或System.StringBuilder。
布尔类型
另外,在一般在C/C++中,BOOL类型数据长度为32位,C#中bool类型数据长度为8位,可以使用Convert.ToBoolean()函数将C++ 32的BOOL转换为C#中的bool,也可直接定义System.UInt32类型,以解决互相调用时数据对齐问题。
结构体
c/c++ 中struct类型,在C#中为public struct{};举例,c中定义的结构体如下:
struct FrameInfo
{
int id;
double price;
int stores[5];
};
对应的C#中的结构体类型为:
public struct FrameInfo
{
public int id;
public double price;
数组传递时,需要设置两个参数,1,数组传递,2,长度
[MarshalAs(UnmanagedType.ByValArray,SizeConst =5)]
public int[] stores;
};
指针
C#中可用System.IntPtr 来读取或操作C/C++中的指针类型,包括void类型。在一些比较复杂的函数中,比如返回值类型为比较复杂的结构体,有时需要将结构体转换为指针类型,即将结构体转为void类型,然后C#可通过IntPtr进行操作。
以上,记录下,欢迎评论区留言讨论。水平有限,如有错漏,恳请指正。

9841

被折叠的 条评论
为什么被折叠?



