C#:匿名变量的内存分配

时间:2010-09-22 06:16:23

标签: c# anonymous-types

我对匿名类型变量的memmory分配有疑问。

如果我声明变量int Vaiable_Name,它将分配4 bytes

但是在Anonymous types的情况下,会发生什么,何时内存将被解除分配?

我们需要手动解除分配吗?

例如

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

这将为bytes分配多少X

2 个答案:

答案 0 :(得分:8)

您实际上没有显示任何匿名类型。你已经展示了一个lambda表达式。在这种情况下,编译器将有效地为您创建一个额外的方法,如下所示:

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.WhereEnumerable.ToList的正常调用。)

因此,X最终会成为字符串参数。在执行时,没有lambda表达式(将表达式树放在一边)。只使用生成的方法创建了一个委托。

现在,如果 使用匿名类型,请执行以下操作:

var anon = new { Name = "Jon", Age = 34 };

然后,这将创建一个新类,包含string变量和int变量,并且内存占用与包含string的普通类相同(这是一个当然是参考)和int

答案 1 :(得分:2)

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"
};