这是复制引用还是对象?

时间:2010-06-16 16:46:27

标签: c# oop object namevaluecollection

对不起,我既厚又懒,但大多是懒惰的。实际上,甚至没有。我正在努力节省时间,因此我可以在更短的时间内完成更多工作,因为还有很多工作要做。

这会复制引用还是实际的对象数据?

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之后,如果我需要确保我作为toPass传递的NVC和NVC私有字段_nvc具有完全相同的内容,我只需要比较它们的引用,对吗?

4 个答案:

答案 0 :(得分:3)

是的,这是正确的。但是,如果您想稍后比较toPassFoo._nvc,您仍然可能希望进行成员比较,因此不同但等效的集合相等。

答案 1 :(得分:1)

总之,是的。

答案 2 :(得分: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();
        }
    }

答案 3 :(得分:-2)

编辑:是的,这复制了参考值。

我同意Matthew Flaschen的深度复制比较 - 并且还会使您的等式比较运算符超载