1

私は自分の答えを検索しようとしましたが、C# ではなく C に関してそれらを見つけたので、投稿することを考えました。

ここでの私の質問は些細なことかもしれません。

私の理解によると(簡単な言葉で)

コピー完了後

浅いコピー -> メイン オブジェクトとコピーされたオブジェクト (参照または値型) は、メモリ内の同じオブジェクトを指す必要があります

DeepCopy -> メイン オブジェクトとコピーされたオブジェクト (参照または値の型) は、メモリ内の異なるオブジェクトを指す必要があります

これを進めて、C# に構造があり、同じ構造の浅いコピーを作成しようとしています。「MemberwiseClone」メソッドを使用してみましたが、参照型でしか機能しないと思います。値型の場合、「MemberwiseClone」メソッドはそれをオブジェクトにボックス化し、スタック内の別のメモリアドレスにボックス化解除すると思います。

私が試したことは以下の通りです。

私の質問は、単純な構造の浅いコピーを作成するにはどうすればよいですか (可能な場合) ?

ここで私の基本が正しく、くだらない話をしていないことを願っています。私が行った声明のいずれかで私が間違っている場合は、私を修正してください。

よろしく、

サマール

struct MyStruct : ICloneable
{
    public int MyProperty { get; set; }

    public object Clone()
    {
        return this.MemberwiseClone();//boxing into object
    }
}


    private void btnChkStr_Click(object sender, EventArgs e)
    {
        MyStruct struct1 = new MyStruct();
        struct1.MyProperty = 1;

        //MyStruct struct2 = struct1; //This will create a deep copy
        MyStruct struct2 = (MyStruct)(struct1.Clone());//unboxing into structure hence allocating a different memory address
        struct2.MyProperty = 2;

        MessageBox.Show(struct1.MyProperty.ToString()); //still showing 1
    }
4

4 に答える 4

1

「コピー」に何が必要かわかりません。他の場所で述べたように、構造体は、メソッドに割り当てられるか渡されるときに、値によって既にコピーされています。だから多分あなたは余分なものを必要としませんか?

たぶん、これは単にあなたが望むものです (何かに役立つかどうかはわかりません!):

struct MyStruct : ICloneable
{
    public int MyProperty { get; set; }

    public MyStruct Clone()
    {
        return this;
    }
    object ICloneable.Clone()
    {
        return Clone();
    }
}

警告の言葉:自動プロパティのアクセサーが public であるため、 YourMyStructはいわゆる可変構造体です。set値型のセマンティクスと可変性の組み合わせが驚くべき動作につながる可能性があるため、多くの人は可変構造体を「悪」と考えています。

編集:struct参照によるコピーのセマンティクスが必要な場合は、最初に ではなくa を使用するのはなぜclassですか? 構造体は、クラスのようにオブジェクトの場所への参照ではありません。他の人が例を示しているようMyStructに、object変数にボックス化すると、値を含むボックスobjectへの参照になります。ボックスへの参照は、参照によってコピーできます。MyStruct

type のインスタンス フィールドを 1 つだけ含むクラスを作成できますMyStruct。次に、このクラスは構造体を参照型に「ラップ」し、通常の参照型セマンティクスによってそのようなクラスのインスタンスをコピーできます (参照をコピーします。オブジェクト自体はコピーされません)。

于 2013-08-02T09:31:15.077 に答える