Вы на самом деле не показывали никаких анонимных типов.Вы показали лямбда-выражение.В этом случае компилятор фактически создаст для вас дополнительный метод, например:
private static bool SomeUnspeakableName(string X)
{
return X != "1";
}
Тогда ваш код будет фактически переведен в это:
List<String> MyList=new List<String>{"0","1","0"}
.Where(new Func<string, bool>(SomeUnspeakableName))
.ToList();
..кроме на самом деле , в этом случае компилятор создаст один экземпляр делегата и кеширует его.(И, конечно, он преобразует использование методов расширения в обычные вызовы Enumerable.Where
и Enumerable.ToList
.)
Таким образом, X
, в конце концов, эффективно становится строковым параметром.Во время выполнения не существует такого понятия, как лямбда-выражение (оставляя деревья выражений в стороне).Есть только делегат, созданный с использованием сгенерированного метода.
Теперь, если вы были , используя анонимные типы, например:
var anon = new { Name = "Jon", Age = 34 };
, тогда это просто создаст новый класссодержит переменную string
и переменную int
и тот же объем памяти, что и обычный класс, содержащий string
(который, конечно, является справочной) и int
.