代码之家  ›  专栏  ›  技术社区  ›  Thorin Oakenshield

C:匿名变量的内存分配

  •  3
  • Thorin Oakenshield  · 技术社区  · 14 年前

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

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

    但如果是 Anonymous types ,将发生什么,何时释放内存?

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

    例如

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

    这里多少钱 bytes 将分配给 X ?

    2 回复  |  直到 14 年前
        1
  •  8
  •   Jon Skeet    14 年前

    您实际上没有显示任何匿名类型。您已经显示了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 变量,与包含 一串 (当然,这是一个参考)和 int .

        2
  •  2
  •   Darin Dimitrov    14 年前
    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"
    };