C #: распределение памяти для анонимных переменных - PullRequest
3 голосов
/ 22 сентября 2010

У меня есть сомнения относительно выделения памяти для переменной анонимного типа.

если я объявлю переменную int Vaiable_Name, она будет выделять 4 bytes

, но в случае Anonymous types что произойдет, и когда память будет освобождена?

Нужно ли нам выделять это вручную ??

, например

List<String> MyList=new List<String>{"0","1","0"}.Where(X=>X!="1").ToList();

Здесь сколько bytes будет выделено для X?

Ответы [ 2 ]

8 голосов
/ 22 сентября 2010

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

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.

2 голосов
/ 22 сентября 2010
List<String> MyList = new List<String>{"0","1","0"}.Where(X=>X!="1").ToList();

Это не анонимный тип.Это инициализатор коллекции, который создает список, содержащий 3 элемента, а затем фильтрует первоначально созданный список.

Анонимные типы будут вести себя и использовать ту же память, что и их эквивалент неанонимного типа.

var foo = new 
{
    Prop1 = "value1",
    Prop2 = "value2"
};

будет таким же, как если бы у нас был тип:

class Foo 
{
    public string Prop1 { get; set; }
    public string Prop2 { get; set; }
}

...
var foo = new Foo 
{
    Prop1 = "value1",
    Prop2 = "value2"
};
...