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

StringBuilderaと a の比較は組み込まれていません。 string anyStringBuilderと astringを比較すると、常に が返されfalseます。

StringBuilderクラスには、次の 2 つの Equals オーバーロードがあります。

  1. から継承されobject、参照比較を実行するEquals(object) 。
  2. Equals(StringBuilder)StringBuildersは、含まれる文字列に基づいて2 つを比較します。

オーバーロード 1 を呼び出しているため、内容を比較していません。

を呼び出し.ToString()s含まれている文字列を取得し、それを呼び出しEqualsて文字列比較を取得します。

于 2012-07-04T17:31:35.937 に答える