Назначение нескольких ссылок для одного и того же объекта класса - PullRequest
0 голосов
/ 14 августа 2011

Этот демонстрационный класс для объяснения вопроса

 public class SomeClass
    {
        public string Name { get; set; }
        public int Age { get; set; }

    }

При разработке чего-то равного sample code Я включил в этот вопрос, у меня возникла следующая мысль:

Поскольку классы являются ссылочным типоми если я назначу несколько экземпляров одному и тому же class object с использованием loop и сохраню эти объекты в списке, разве этого недостаточно, чтобы испортить каждый объект и сделать его равным последнему назначенному ему экземпляру?

Вот пример реализации путаницы

List<SomeClass> lst = new List<SomeClass>();
SomeClass someClassObj = null;

for (int i = 0; i < 3; i++)
{
     someClassObj = new SomeClass();
     someClassObj.Name = "Name " + i.ToString();
     someClassObj.Age = i;
     lst.Add(someClassObj);
}

после тестирования, она не пошла так, как я думал, в любом случае, то, что я хочу
кто-нибудь поможет устранить эту путаницу.

Ответы [ 2 ]

1 голос
/ 14 августа 2011

На самом деле вы назначаете новую ссылку на someClassObj на каждой итерации, а затем добавляете копию этой ссылки в свой список. Вы не добавляете ссылку на someClassObj в свой список. Метод Add должен принимать параметр ref, чтобы он был ссылкой на someClassObj.

1 голос
/ 14 августа 2011

Каждый раз, когда вы делаете

someClassObj = new SomeClass();

новый кусок памяти создается в куче, и его адрес присваивается someClassObj, что означает, что в вашем списке на самом деле есть не только один адрес, который вы добавляете снова и снова, но и новый адрес, и поэтому при сравнении объект они не будут одинаковыми, потому что у них другой адрес

изначально

SomeClass someClassObj = null; ваш объект ни на что не указывает. когда вы создаете новый экземпляр, используя new (), ваш объект начинает указывать на адрес новой выделенной памяти. Таким образом, внутри цикла каждому экземпляру назначается новый адрес, и этот адрес сохраняется в SomeClass, который является тем же указателем / ссылкой. Когда вы добавляете элемент в список, он фактически добавляет адрес / ссылку на элемент, на который в данный момент указывает SomeClass

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...