5

私が書いたオブジェクトの完全修飾名がおかしなことに戻ってきていることに気づきました。ToString()メソッドをステップ実行しているときに、文字列を連結する場合、文字オブジェクトが一貫してそのプロセスから除外されていることに気付きました。

これが何が起こっているかのステップスルーです

前

後

どこChar seperator = ':';

これが私のtostring関数のコードです:

public String ToString(Representaion rep)
        {
            String toReturn = "kuid";
            Char separator = ':';

            switch (rep)
            {
                case Representaion.Colons:
                    break;
                case Representaion.Underscores:
                    separator = '_';
                    break;
                case Representaion.UCROnly:
                    toReturn = userID + ":" + contentID;
                    toReturn += revision == 0 ? "" : ":" + revision;
                    return toReturn;
            }

            toReturn += version == 0 ? "" : version.ToString();
            toReturn += separator + userID + separator + contentID;
            toReturn += revision == 0 ? "" : separator + revision.ToString();
            return toReturn;
        }

あなたが持っているところ

private byte version;
private int userID;
private int contentID;
private byte revision;

そして、1つのケースは次のようになります。

ここに画像の説明を入力してください

すでに、ローカルパネルを見ると、VSは私が思っているものとは異なる文字列を取得しているようです。

別のToString関数を入れて、パラメーターなしで呼び出しを処理します(これは、Representation.Colonsを使用してパラメーター化された関数を呼び出すことによって行われます)。

public override string ToString()
        {
            return this.ToString(KUID.Representaion.Colons);
        }

なぜ私が得るべきだと思うものが得られないのか誰かに教えてもらえますか?(期待される結果:kuid2:72938:40175:2)

4

3 に答える 3

12

プログラムをさらに投稿したので、問題は明らかです。Charとintは文字列ではありません。覚えて、

string += char + int + char + int

意味:

string = string + (((char + int ) + char) + int)

また、charにintを追加すると、int:が取得され、文字列ではなく、に'a' + 2対応する整数の文字コードが生成されます。'c'"a2"

コロン文字にユーザーIDを追加すると、クレイジーな整数が得られます。

このように文字列を連結することは、まさにあなたが遭遇した理由のために悪い習慣です。代わりに、次のように言います。

return string.Format("kuid{0}{1}{2}{3}{4}{5}{6}",
    version, separator, userID, separator, contentID, 
    revision == 0 ? "" : separator.ToString(),
    revision == 0 ? "" : revision.ToString());

または、さらに良いことに、オブジェクトを使用しStringBuilderて複雑な文字列を作成します。

ちなみに、これは言語に関する興味深い点を示しています。

a += b + c;

という意味ではない

a = (a + b) + c; 

その意味は

a = a + (b + c);

これまで見てきたように、これは別のタイプの分析があるかもしれません!あなたは言った:

string = string + char + int + char + int

それならそれは次のように分析されたでしょう

string = ((((string + char) + int) + char ) + int;

これはすべてを文字列にします。

于 2012-12-23T14:20:46.570 に答える
1

右側の式は文字列式ではないため、問題が発生します。文字列式内で使用されない限り、自動的に文字列に変換されない文字と整数を操作しています。文字列(ここでは空の文字列)で開始することにより、文字列式にすることができます。

toReturn += "" + separator + userID + separator + contentID;
于 2012-12-23T14:39:24.413 に答える
1

コードをコピーして貼り付けましたが、正常に機能します

ここに画像の説明を入力してください

于 2012-12-23T05:09:19.930 に答える