2

(学习 c# 的第 2 天)我正在将缓冲区从 C# 传递给 C dll。C 函数将字符串“text”复制到缓冲区中。回到 C# 代码中,我将“文本”与缓冲区中的内容进行比较,但结果并不相等。我错过了什么?

    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();
        }
    }
}
4

2 回答 2

3

s是一个StringBuilderzz而是一个string

尝试比较

s.ToString().Equals(zz);

通常,Equals()对引用类型执行引用比较。某些类(例如 String)覆盖Equals()以允许包含相同字符的字符串被视为相等(尽管出于性能目的,我相信实际实现首先检查引用相等,然后比较每个字符串的内容)。

您当前的代码正在调用 .Equals() 的方法StringBuilder

于 2012-07-04T17:29:04.740 回答
1

没有内置的 aStringBuilder与 a 的string 比较 将任何StringBuilder与 a进行比较string将始终返回false

StringBuilder类有两个 Equals 重载:

  1. Equals(object)继承自object并执行引用比较。
  2. Equals(StringBuilder)StringBuilders根据它们包含的字符串比较两个。

您正在调用重载 1,因此它不比较内容。

调用.ToString()s获取它包含的字符串,然后调用Equals它以获取字符串比较。

于 2012-07-04T17:31:35.937 回答