Почему анонимные типы в .NET реализованы как ссылочный тип? - PullRequest
9 голосов
/ 18 августа 2011

Поскольку анонимный тип в любом случае доступен только для чтения, он был бы более эффективен, если бы они реализовали их как структуры, так что запросы linq не должны создавать тонны временных объектов:

// This doesn't make any sense, it is just for demonstration
var result = thingies
.Select(x=> new {A = 1, B = 2, C = 3});

Btw. Я получил эту идею, когда читает это

EDIT:

Самым большим было бы, если бы компилятор, в зависимости от размера и использования переменной (должен передаваться множеству методов), решал, делать ли это тип значения или ссылочный тип.

Но может ли следующее предложение, которое я нашел в msdn, вызвать проблемы тогда:

Если два или более анонимных типа в одной сборке имеют одинаковые количество и тип свойств, в том же порядке, компилятор обрабатывает их как того же типа.

Поскольку анонимный объект (со связанным с ним типом) не может покинуть метод, в котором он определен, у нас нет проблем, не так ли?

Ответы [ 2 ]

6 голосов
/ 18 августа 2011

Полный сборщик мусора .NET особенно хорошо оптимизирован для двух случаев: большие, долгоживущие объекты, которые служат значительную часть времени, и маленькие, недолговечные объекты, которые быстро отмирают.Коллекции Gen0 практически бесплатны, учитывая, насколько они быстры (настолько быстры и часты, что многие профилировщики даже не удосуживаются показать их или их содержимое), поэтому нет особых причин избегать временных временных затрат, которые не попадают в сферу действияфункция, которая их создала.

Анонимные типы подходят практически ко второму случаю;они не предназначены для того, чтобы пережить функцию, которая их создает (хотя вы можете сделать это с некоторыми хитростями).Учитывая эту модель, а также тот факт, что большинство типов значений являются относительно дорогими для копирования, и учитывая, что многие запросы LINQ включают в себя длинную цепочку функций, для которых всем требуется еще одна копия, для меня имеет смысл, что дизайнеры решили сделатьих ссылочные типы.

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

Если бы анонимные типы были типами значений, я уверен, что мог бы сделать несколько тестов, которые бы показали, насколько ужасным было все копирование и как они должны быть ссылочными типами, чтобы их не нужно было копировать везде. Оба подхода имеют свои преимущества и недостатки, и разработчики языка решили использовать ссылочные типы; Я подозреваю, что ссылочные типы являются более распространенными, более понятными и работают с большим количеством API, чем с типами значений.

Максимальная скорость не относится к анонимным типам. Они созданы для 90% разработчиков, выполняющих запросы LINQ разумного размера, которым необходим промежуточный тип для хранения результатов. Для 10%, которым требуются миллионы объектов, я бы предложил создать конкретный тип и потратить некоторое время на оптимизацию.

...