4

まず、これが保護されたメソッドであり、呼び出す必要がないことを知っていますが、MemberwiseCloneがObjectクラスで定義され、Stringがそれを継承しているため、機能しないはずです。

したがって、これはクローン作成方法です(重要なことに焦点を当てるために、null参照処理を削除しました)。

public static T ShallowClone<T>(T obj)
{
    MethodInfo memberwiseClone;
    memberwiseClone = obj.GetType().GetMethod("MemberwiseClone", BindingFlags.Instance | BindingFlags.NonPublic);
    return (T)memberwiseClone.Invoke(obj, null);
}

そして、私がそれをこのように呼ぶならば:

string str = ShallowClone("My string");

結果の文字列(str)は次のようになります。

"M\0\0\0\0\0\0\0\0"

前もって感謝します!

4

1 に答える 1

3

あなたはそれを呼んでいて、それは働いています。問題は、String.MemberwiseCloneあなたが期待していることをしていないということです。元の文字列と同じ長さの文字列を作成しているように見えますが、最初の文字をコピーするだけです。

ここで学ぶべき教訓は次のとおりです。呼び出すべきではないメソッドを呼び出すときは、細心の注意を払い、その機能を学び、あまり想定しないでください。

于 2012-05-17T23:20:11.303 に答える