Извините, я являюсь и толстым и ленивым, но главным образом ленивым. На самом деле, даже это. Я пытаюсь сэкономить время, таким образом, я могу сделать больше за меньшее время, поскольку существует много, чтобы быть сделанным.
Это копирует ссылку или данные фактического объекта?
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
, если я должен был удостовериться, что NVC передал как toPass
и частное поле NVC _nvc
то же самое содержание, я имел, должен будет просто сравнить их ссылки, правильно?
Да, это верно. Однако если вы захотите сравнить toPass
и Foo._nvc
позже, вы все равно захотите выполнить сравнение по членам, чтобы разные, но эквивалентные коллекции сравнивались одинаково.
Вы передаете ссылочный тип по значению. Вы можете изменить данные, на которые указывает ссылка (например, добавить новые элементы в коллекцию), и изменения будут отражены для вызывающей стороны. Как указал Мэтью, вам все равно может потребоваться проверка на наличие различных, но эквивалентных объектов.
Предполагая, что вы придерживаетесь напечатанного вами использования и не выполняете никаких «новых» операций, ссылки на объекты останутся эквивалентными.
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();
}
}
Edit: Да, это скопировало значение ссылки.
Я также согласен с Мэтью Флашеном в отношении глубокого сравнения копий - а также перегружаю ваш оператор сравнения на равенство