【已更新最新开发文章,点击查看详细】
每个属性的类型由编译器推断。
对象和集合初始值设定项。
以下示例显示了用两个名为 Amount 和 Message 的属性进行初始化的匿名类型。
var v = new { Amount = 108, Message = "Hello" }; // 将鼠标指针停留在下面语句中的v.amount和v.message上,以验证它们的推断类型是int和string。 Console.WriteLine(v.Amount + v.Message);
在VS中编写代码时既可以看出匿名类中的属性类型:
LINQ 查询表达式。
用来初始化属性的表达式不能为 null、匿名函数或指针类型。
这将导致在查询中返回较少数量的数据。
在下面示例中,匿名类型的属性名称都为 Price,Color 。
var productQuery = from prod in products select new { prod.Color, prod.Price }; foreach (var v in productQuery) { Console.WriteLine("Color={0}, Price={1}", v.Color, v.Price); }
隐式类型本地变量。
可通过将隐式键入的本地变量与隐式键入的数组相结合创建匿名键入的元素的数组,如下面的示例所示。
var anonArray = new[] { new { name = "apple", diam = 4 }, new { name = "grape", diam = 1 }};
特别说明
从公共语言运行时的角度来看,匿名类型与任何其他引用类型没有什么不同。
通过dnSpy工具与ILDASM工具可以查看出编译器为匿名类提供的默认类名称,如下图;
它们共享同一编译器生成的类型信息。
如果必须存储查询结果或者必须将查询结果传递到方法边界外部,请考虑使用普通的命名结构或类而不是匿名类型。
GetHashCode 方法是根据方法属性的 Equals 和 GetHashCode定义的,因此仅当同一匿名类型的两个实例的所有属性都相等时,这两个实例才相等。
其他技术请参阅
【已更新最新开发文章,点击查看详细】