IEnumerable переменная хранит ссылки на объект (который, как деталь реализации, будет четыре или восемь байт, в зависимости от процесса). То же самое относится к переменной System.Collections.Generic.List, переменной массива, переменной ICollection или (хотя и не относящейся к вопросу) любой переменной ссылочного типа.
Данные, произведенные перечислителем объекта, будут храниться, однако продиктованы объектом, к которому относятся контрольные точки. В некоторых случаях он будет хранить только первый элемент вместе с некоторой информацией, используемой перечислителем для вычисления последующих элементов (например, System.Linq.Enumerable.Range). В других случаях объектом может быть массив или SCGList (последовательные хранилища - списки используют массивы для их хранения) или связанный список, или хэш-набор или отсортированный набор (который использует хеш-таблицу и двоичное дерево, соответственно) , или просто что-то еще, что кто-то хочет мечтать и реализовать.
В вашем вопросе о выделении памяти, нет никакой разницы в использовании памяти между
IList<Employee> empList = new List<Employee>();
и
IEnumerable<Employee> empList = new List<Employee>();
Разница между этими двумя в методах вы можете вызвать на объект от ссылку на объект empList. В первом случае вы ограничены многими членами, определенными в IList, и интерфейсами, из которых он наследуется, поэтому вы можете мутировать коллекцию. Во втором случае вы можете вызывать только GetEnumerator, поэтому вы не можете мутировать коллекцию.
IEnumerable - это «интерфейс». Это в значительной степени зависит от конкретной реализации.'Array' и' LinkedList' также являются 'IEnumerable', но память, как вы указали, отличается. – 2014-09-11 06:42:53
@pwas: ok, поэтому, когда я использую IEnumerable для хранения коллекции объекта, как компилятор использует для выделения памяти для него? это последовательное? или указатель на основе ссылок или что-то еще? –
Это может быть или что-то еще, это зависит. Интерфейс ничего не подразумевает. –