C++ Char* 转C# string 用StringBuilder转的原因

由于C#中的char与C++中的char是不同的。

是因为编码方式存在着不同,C#中采用Unicode编码,因此,char的取值范围为0-65535。

而C++ char 类型的取值范围为(-127-128)。

正由于C#中的char与C++中不是完全对应的,因此,当C#调用C/C++编写的DLL时,

不能用char[]与对应C/C++中的char*类型,而是要根据实际情况选择byte,string或StringBuilder。

  1. 如果DLL中char*不是用来存储ASCII字符,而是用作buffer(即可能出现0-127以外的值),C#端应该用byte[]。

  2. 如果DLL中char存储一般的ASCII字符,且参数用作输入,C#端应该用string。

  3. 如果DLL中char存储一般的ASCII字符,且参数用作输出,C#端应该用StringBuilder。其原因在后文会有叙述。

    因为此时char*的长度是不确定的,可以用类似

     StringBuilder sb = new StringBuilder(Constants.MAXLEN);

     达到类似C++中

     char* cp = new char[MAXLEN];

     及C中

    char* cp = (char *)malloc(sizeof(char) * MAXLEN); 的效果。

那么,在C#调用C的DLL时,为什么对于作为输出的参数要用StringBuilder呢?

因为string不能改变自身的值,如果用string的话,函数调用之后string的值不会发生改变。所以输出的参数或返回值我们用StringBuilder来接收。

猜你喜欢

转载自www.cnblogs.com/yezhizheng/p/10642367.html