我对匿名类型变量的memmory分配有疑问。
如果我声明变量int Vaiable_Name
,它将分配4 bytes
但是在Anonymous types
的情况下,会发生什么,何时内存将被解除分配?
我们需要手动解除分配吗?
例如
List<String> MyList=new List<String>{"0","1","0"}.Where(X=>X!="1").ToList();
这将为bytes
分配多少X
?
答案 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.Where
和Enumerable.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"
};