1

申し訳ありませんが、私は厚くて怠惰ですが、ほとんど怠惰です。実際、それでもありません。やるべきことがたくさんあるので、より少ない時間でより多くのことができるように時間を節約しようとしています。

これは参照または実際のオブジェクトデータをコピーしますか?

public class Foo
{
    private NameValueCollection _nvc = null;

    public Foo( NameValueCollection nvc)
    {
        _nvc = nvc;
    }
}

public class Bar
{
    public static void Main()
    {
        NameValueCollection toPass = new NameValueCollection();
        new Foo( toPass ); // I believe this only copies the reference
                           // so if I ever wanted to compare toPass and 
                           // Foo._nvc (assuming I got hold of the private 
                           // field using reflection), I would only have to
                           // compare the references and wouldn't have to compare
                           // each string (deep copy compare), right?
}

私は確かに答えを知っていると思います:それは参照をコピーするだけです。しかし、なぜ私がこれを求めているのかさえわかりません。

私の唯一の懸念は、Fooパラメーター化されたctorをで呼び出してインスタンス化した後toPass、渡したNVCtoPassとNVCプライベートフィールド_nvcの内容がまったく同じであることを確認する必要がある場合、それらの参照を比較する必要があることだと思います。右?

4

4 に答える 4

3

それは正解です。ただし、後で比較する場合toPassFoo._nvc、メンバーごとの比較を行うことをお勧めします。そのため、異なるが同等のコレクションは同等に比較されます。

于 2010-06-16T16:47:44.760 に答える
1

一言で言えば、そうです。

于 2010-06-16T16:48:00.597 に答える
0

参照型を値で渡しています。参照が指すデータを変更することができ (コレクションに新しいアイテムを追加するなど)、その変更は呼び出し元に反映されます。Matthew が指摘したように、別のまだ同等のオブジェクトをチェックする必要があるかもしれません。

印刷した使用法に固執し、「新しい」操作を実行しないと仮定すると、オブジェクト参照は同等のままです。

public class Foo 
    { 
        public NameValueCollection _nvc = null;

        public Foo( NameValueCollection nvc) 
        {
            //this is cool
            _nvc = nvc;
            _nvc.Add("updated", "content");

            //this isn't cool. Now you have a new object with equivalent members and you should follow Matthew's advice
            //_nvc = new NameValueCollection();
            //_nvc.Add("foo", "bar");
            //_nvc.Add("updated", "content");
        } 
    }

    public class Bar
    {
        public static void Main()
        {
            NameValueCollection toPass = new NameValueCollection();
            toPass.Add("foo", "bar");
            Foo f = new Foo(toPass); 

            if (Object.Equals(toPass, f._nvc))
                Console.WriteLine("true");
            else
                Console.WriteLine("false");
            Console.ReadLine();
        }
    }
于 2010-06-16T17:13:36.363 に答える
-2

編集:はい、これは参照の値をコピーしました。

また、ディープ コピーの比較について Matthew Flaschen に同意します。また、等価比較演算子をオーバーロードします。

于 2010-06-16T16:57:03.467 に答える