IEnumerable, когда я получаю реальную ссылку на объекты? - PullRequest
1 голос
/ 31 марта 2010
IEnumerable<T> collection;

void MyMethod(T toSearch)
{
  foreach (T t in collection)
    if (t == toSearch) {}
}

Предложение if никогда не является истинным. Это потому, что перечислитель создает все экземпляры элементов по требованию, поэтому каждый раз при создании новой ссылки?

Отредактировано:

Еще один вопрос. Что произойдет, если я один из этих элементов коллекции вернусь в T MyMethod () , Есть ли у меня ссылка на существующий экземпляр, который действительно находится в памяти, так что все сделанные в нем изменения будут отражены в этом элементе ... или возвращенный элемент является новым экземпляром ... или я не могу этого сделать Я не понимаю

Ответы [ 2 ]

2 голосов
/ 31 марта 2010

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

Однако, не будет использовать любую перегрузку ==, которая может быть допустимой для вашего конкретного T. Например:

List<string> strings = new List<string> { "hi" };
string hi = "hi";
string otherHi = new string(new char[]{'h', 'i'});

MyMethod(hi); // Will match
MyMethod(otherHi); // Won't match

Чтобы использовать нормальное равенство вместо ссылочного равенства, вы можете изменить свой метод на:

if (EqualityComparer<T>.Default.Equals(t, toSearch))
{
    //
}
0 голосов
/ 31 марта 2010

Ответ таков: «это зависит», но перечислители обычно используются для прохождения (перечисления) существующих объектов.

...