当前位置:首页 > Windows程序 > 正文

C#匿名类型(Anonymous Type)学习日记

2021-03-27 Windows程序

当我们不要定义复杂的方法,事件,构造函数这样复杂的类的时候,可以动态的生成一个自定义的数据类型 --> 匿名类型。

1.定义匿名类型

定义一个匿名类型时,需要用到 var 关键字和对象初始化语法。

var : 编译器会在编译时自动生成新类定义(我们无法在C#代码中看到类的名称)。

初始化:它将告诉编译器为新创建的类型创建私有的后台字段和(只读的)属性。

通过传递参数构建一个匿名类型,并打印相关信息

private static void BiuldAnonymousType(string make, string color, int currSp) { // 使用传入参数构建匿名类型 var car = new { Make = make, Color = color, CurrSp = currSp }; // 获取属性数据 Console.WriteLine($"{car.Color} 的 {car.Make} 时速{car.CurrSp}"); // 匿名类型包含对System.Object中每个虚方法(virtual)的自定义实现 Console.WriteLine($"ToString={car.ToString()}"); }

调用:也可以使用硬编码构建匿名类型

public static void Show() { Console.WriteLine("fun with anonymous types"); // 注意 匿名类型也可以使用硬编码创建 // 构建一个匿名对象表示汽车 var car = new { Make = "honda", Color = "blue", CurrSp = 180 }; // 输出颜色和车 Console.WriteLine($"我的车是{car.Color}{car.Make}"); // 调用辅助方法通过参数创建匿名类型 BiuldAnonymousType("baoma", "white", 220); }

2.匿名类型的内部表示方式

所有的匿名类型都自动继承Object,所以我们可以在 car 对象上ToString,GetHashCode,Equals,我们尝试调用一下:

private static void ReflectOverAnonymousType(object obj) { Console.WriteLine($"对象实例:{obj.GetType().Name}"); Console.WriteLine($"类型: {obj.GetType().Name} 基类: {obj.GetType().BaseType}"); Console.WriteLine($"toString():{obj.ToString()}"); Console.WriteLine($"getHashCode():{obj.GetHashCode()}"); }

调用以及结果:

public static void Show() { Console.WriteLine("fun with anonymous types"); // 构建一个匿名对象表示汽车 var car = new { Make = "honda", Color = "blue", CurrSp = 180 }; ReflectOverAnonymousType(car); }

car对象的类型是:<>f__AnonymousType0`3(你的或许不同),匿名类型名称由编译器觉得,我们无从干涉,CIL代码。

 3.方法 ToString() 和 GetHashCode() 的实现

1.ToString()

public override string ToString() { StringBuilder builder = new StringBuilder(); builder.Append("{ Color = "); builder.Append(this.<Color>i_Field); builder.Append(", Make = "); builder.Append(this.<Make>i_Field); builder.Append(", CurrSp = "); builder.Append(this.<CurrSp>i_Field); builder.Append("}"); return builder.ToString(); }

2.GetHashCode()

它使用每个匿名类型的变量计算出散列值作为System.Collections.Generic.EqualityComparer<T>的类型输入,仅当两个匿名类型有相同的属性并且被赋予了相同的值,,才会产生相同的散列值。

4.匿名类型的相等语义

Equals()

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/68668.html