Это копирует ссылку или объект?

Извините, я являюсь и толстым и ленивым, но главным образом ленивым. На самом деле, даже это. Я пытаюсь сэкономить время, таким образом, я могу сделать больше за меньшее время, поскольку существует много, чтобы быть сделанным.

Это копирует ссылку или данные фактического объекта?

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 то же самое содержание, я имел, должен будет просто сравнить их ссылки, правильно?

1
задан Water Cooler v2 16 June 2010 в 16:46
поделиться

4 ответа

Одним словом, да.

1
ответ дан 2 September 2019 в 23:44
поделиться

Да, это верно. Однако если вы захотите сравнить toPass и Foo._nvc позже, вы все равно захотите выполнить сравнение по членам, чтобы разные, но эквивалентные коллекции сравнивались одинаково.

3
ответ дан 2 September 2019 в 23:44
поделиться

Вы передаете ссылочный тип по значению. Вы можете изменить данные, на которые указывает ссылка (например, добавить новые элементы в коллекцию), и изменения будут отражены для вызывающей стороны. Как указал Мэтью, вам все равно может потребоваться проверка на наличие различных, но эквивалентных объектов.

Предполагая, что вы придерживаетесь напечатанного вами использования и не выполняете никаких «новых» операций, ссылки на объекты останутся эквивалентными.

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();
        }
    }
0
ответ дан 2 September 2019 в 23:44
поделиться

Edit: Да, это скопировало значение ссылки.

Я также согласен с Мэтью Флашеном в отношении глубокого сравнения копий - а также перегружаю ваш оператор сравнения на равенство

-2
ответ дан 2 September 2019 в 23:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: