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,如果我需要确保我传递toPass的 NVC 和 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 回答