对不起,我既厚又懒,但大多是懒惰的。实际上,甚至没有。我正在努力节省时间,因此我可以在更短的时间内完成更多工作,因为还有很多工作要做。
这会复制引用还是实际的对象数据?
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
具有完全相同的内容,我只需要比较它们的引用,对吗?
答案 0 :(得分:3)
是的,这是正确的。但是,如果您想稍后比较toPass
和Foo._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的深度复制比较 - 并且还会使您的等式比较运算符超载