Подтвердить что ты не робот

Есть ли способ создать анонимные структуры в С#?

Кажется, что какой-либо тип анонимных типов не существует. Но я думал, что прошу, потому что большую часть времени мы используем анонимные типы в простых выражениях запроса для извлечения подмножеств данных, которые будут использоваться в тех анонимных типах, которые мы создаем. Мне кажется, что они должны быть структурами (типами значений) для большей эффективности памяти по сравнению с ссылочными типами.

Мысли?

4b9b3361

Ответ 1

Нет поддерживаемого синтаксиса С#, который будет создавать анонимные структуры

Ответ 2

UPDATE: теперь на С# 7 есть кортежи типа значений, которые могут использоваться в тех же самых контекстах, в которых используются анонимные типы ссылочного типа.


Кажется, что это общепринятая идея о том, что типы значений являются "более эффективными", чем ссылочные типы. Это совершенно мифическое; они более эффективны для некоторых операций и менее эффективны для других.

Например, большие типы значений менее эффективны по сравнению с ссылочными типами, если работающая единица работы, о которой вы беспокоитесь, - это "копировать значение в новое место". Тип ссылки копирует ссылку размера указателя независимо от размера указанных данных и, следовательно, копирует в одной высокооптимизированной машинной инструкции. Тип значения копирует размер данных каждый раз, что может быть довольно большим и принимать несколько инструкций.

Независимо от того, анонимные типы являются исключительно удобной функцией. Если вам не нравятся их эксплуатационные характеристики, вам не нужно их использовать. Вы можете определить свою собственную структуру, если хотите.

Ответ 3

Профилировали ли вы свое приложение и обнаружили анонимные типы как самую медленную его часть? Если это так, я предлагаю вам вручную создать необходимые структуры и повторить проверку, чтобы убедиться, что эта проблема устранена. В противном случае я потратил бы больше времени на беспокойство по поводу проблем с бизнесом и меньше времени на ввод текста (например, функция позволяет).

Ответ 4

Для многих случаев использования анонимные типы и кортежи были бы более эффективными, если бы они были реализованы как структуры public-field, а не как неизменные классы; может ли конкретный анонимный тип или кортеж быть более эффективным, поскольку такая структура или как непреложный класс не является особенно функцией его размера, а скорее функцией того, как она используется. Если вещь никогда не будет помещена в коробку, относительная стоимость использования структуры по сравнению с классом будет зависеть от размера и от того, сколько раз вещь должна была быть скопирована (обратите внимание, что так называемые "неизменные" структуры часто должны скопируйте их гораздо чаще, чем структуры public-field). Если вещь только копируется один или два раза после построения (обычно во многих сценариях использования), структура публичного поля практически любого размера будет работать лучше, чем может быть неизменяемым классом. С другой стороны, если вещь часто будет принудительно привязана к эталонному типу, неизменяемый класс существенно превзойдет структуру, независимо от того, насколько она мала.

Расходы на типы структур принуждения на типы ссылок и тот факт, что некоторые случаи использования требовали сделать это часто, означает, что даже если для большинства временных объектов структуры были бы более эффективными, чем неизменные объекты класса, использование структур для всего было бы менее эффективны, чем использование объектов неизменяемого класса для всего. Случаи использования, когда структуры позволят повысить общую производительность на 10% или более, вероятно, слишком редки, чтобы оправдать затраты на наличие двух разных типов кортежей и двух разных типов встроенных анонимных типов. Код, который требует преимуществ производительности открытых полей, может легко определить типы структуры для их точных целей.

Ответ 5

Я иногда использую анонимные объекты:

var x = new 
{
    itm0 = new { key = "key0", val = 0},
    itm1 = new { key = "key1", val = 1},
};