(学习c#的第2天)我正在从C#传递缓冲区到C dll。 C函数将字符串“text”复制到缓冲区中。回到C#代码中,我将“text”与缓冲区中的内容进行比较,并且它没有比较相等。我错过了什么?
extern "C" __declspec( dllexport )
int cFunction(char *plotInfo, int bufferSize)
{
strcpy(plotInfo, "text");
return(0);
}
C#
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;
namespace ConsoleApplication1
{
class Program
{
[DllImport("mcDll.dll", CallingConvention = CallingConvention.Cdecl,
CharSet=CharSet.Ansi)]
public static extern int cFunction(StringBuilder theString, int bufSize);
static void Main(string[] args)
{
StringBuilder s = new StringBuilder(55);
int result = cFunction(s, 55);
Console.WriteLine(s);
string zz = "text";
if (s.Equals(zz))
Console.WriteLine( "strings compare equal");
else
Console.WriteLine("not equal");
Console.ReadLine();
}
}
}
答案 0 :(得分:3)
s
是StringBuilder
,而zz
是string
。
尝试比较
s.ToString().Equals(zz);
通常,Equals()
执行引用类型的引用比较。某些类(如String)覆盖Equals()
以允许包含相同字符的字符串被视为相等(尽管出于性能目的,我相信实际实现首先检查引用相等性,然后比较每个字符串的内容)。
您当前的代码正在调用StringBuilder
的.Equals()方法。
答案 1 :(得分:1)
StringBuilder
与string
没有比较内容比较任何StringBuilder
与string
总是会返回false
。
StringBuilder类有两个Equals重载:
object
并执行参考比较。StringBuilders
。您正在调用重载1,因此不会比较内容。
在.ToString()
上调用s
以获取其中包含的字符串,然后在其上调用Equals
以进行字符串比较。