在C#中,普通类型和匿名类型在编译过程和运行时内存管理方面有何区别?匿名类型是否比普通类型更低效?
在C#中,普通类型和匿名类型在编译过程和运行时内存管理方面有何区别?匿名类型是否比普通类型更低效?
来自MSDN:
匿名类型 提供了一种方便的方式将一组只读属性封装到一个对象中,而无需先明确定义一个类型。类型名称由编译器生成,在源代码级别不可用。属性的类型由编译器推断。
备注:
匿名类型是从 object 直接派生的引用类型。编译器为它们赋予一个名称,但你的应用程序无法访问它。从公共语言运行时的角度来看,匿名类型与任何其他引用类型没有区别,唯一的区别是除了 object 类型外,它不能被转换为任何其他类型。
static T M<T>(Func<T> f) { return f(); }
现在调用它:var anon = M(()=>new { X = 1 });
函数M创建并返回一个匿名类型对象,调用者成功将其保存到匿名类型的本地变量中,因此你所说的"除非转换为object或dynamic,否则它们无法离开它们创建的范围"的观点是错误的。 - Eric Lippertstatic T N<T>(T t) where T : class { return new { X = 123 } as T; }
然后 var y = N(new { X = 456 });
。现在,N
明显返回一个新创建的对象,但从未将其转换为 object
或 dynamic
,再次证明了您的说法是错误的。 - Eric LippertGetHashCode
和ToString
实现的泛型内部类。就运行时而言,它们并没有任何特殊之处。运行时不知道它们是“匿名”的,运行时将其视为另一个类。生成的代码并不是什么有趣的东西。a = b;
并使其正常工作。此外,这不仅适用于方法内部,还适用于程序集内部。因此:鉴于此要求,您将如何实现编译器以便它能够确定两个匿名类型需要是相同的类型? - Eric Lippert