LINQ - Возвращает ли выражение Where новый экземпляр или ссылку на экземпляр объекта

Это, наверное, основной вопрос для некоторых, но он влияет на то, как я проектирую часть моей программы.

У меня есть одна коллекция типа A:

IEnumerable<A> myCollection;

Я фильтрую моя коллекция по 2 различным критериям:

IEnumerable<A> subCollection1 = myCollection.Where(x => x.Count > 10);
etc.

Теперь я знаю, что выражение .Where вернет новый экземпляр IEnumerable, но содержит ли новая коллекция ту же ссылку на экземпляр типа A, на которую ссылается myCollection, или создаются новые копии типа A? Если создаются новые экземпляры типа «A», есть ли способ сказать, что «subCollection1» ссылается на те же экземпляры A, что и ссылки «myCollection»?

Редактировать: Добавить дополнительные пояснения.

Я ищу таким образом, чтобы при внесении изменения в экземпляр «A» в «subCollection1» он также изменялся на «myCollection».

39
задан Brandon 27 August 2010 в 12:38
поделиться

4 ответа

Экземпляры одинаковы, если они являются классами, но копируются, если они являются структурами/типами значений.

int, byte и double являются типами значений, как и структуры (например, System.Drawing.Point и самоопределяемые структуры). Но строки, все ваши собственные классы, в основном "остальные", являются ссылочными типами.

Примечание. LINQ использует те же правила, что и все остальные назначения.

Для объектов:

Person p1 = new Person();
p1.Name = "Mr Jones";
Person p2 = p1;
p2.Name = "Mr Anderssen";
// Now p1.Name is also "Mr Anderssen"

Для структур:

Point p1 = new Point();
p1.x = 5;
Point p2 = p1;
p2.x = 10;
// p1.x is still 5

Те же правила применяются при использовании LINQ.

44
ответ дан 27 November 2019 в 02:33
поделиться

Это одинаковые объекты. Где только фильтрует, Select создает (может создавать) новые экземпляры.

12
ответ дан 27 November 2019 в 02:33
поделиться

Я просто хотел добавить к некоторым другим ответам - в общем, когда я не уверен в чем-то, но требую определенного поведения, я добавляю для него модульный тест. Вы можете легко поместить это в тест, а затем проверить на равенство, что скажет вам, смотрите ли вы на ссылку объекта в исходном контейнере. Некоторые могут возразить, что это глупо, потому что вы «должны просто знать», что происходит, но я знаю, что либо буду 1) не уверен, потому что я не крутой программист, и 2) всегда есть ночи, когда я должен сжечь полуночное масло, и хорошо иметь уверенность в том, что что-то ведет себя так, как вам нужно.

0
ответ дан 27 November 2019 в 02:33
поделиться

Создание нового объекта ссылочного типа нетривиально. LINQ понятия не имеет, как это сделать. LINQ всегда возвращает одни и те же экземпляры при работе со ссылочными типами.

2
ответ дан 27 November 2019 в 02:33
поделиться
Другие вопросы по тегам:

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