在C#中引入了Linq使得对集合的操纵发生了深刻的变化这个变化的幕后英雄便是扩展方法和匿名类型这里我们谈一谈C#中的匿名类型与隐式类型变量
一匿名类型
所谓匿名类型顾名思义就是没有类型名称的一种特殊的数据类型这意味着我们不能显式的引用这种类型的名称事实上它是由编译器在后台声明并帮你生成必要的代码
代码
class Program
{
public static void Main(string[] args)
{
var T = new {Index = Name = CPUPrice = };
var T = new {Index = Name = MethodBoardPrice = };
var T = new {TIndex Name = SoundCardPrice = };
}
}
以上我们用var 声明了个隐式类型的变量TTT并把创建(new)的个匿名类型的实例分别赋给它们在这里var相当于一个占位符其变量(TTT)的具体的类型是在代码编译时确定的也就是说由赋给它们的值的数据类型而定的因而在最终生成的CIL中TTT是有具体的类型的也就是强类型的
在上例中我们可以看到T中使用了T的属性Index这说明匿名类型的属性是完全可以访问的它们使用了相同的属性名称属性的数据类型也相同并且属性的的顺序也是一致的因而它们具有相同的类型否则就不是兼容的类型了
如以下均不是相同的类型了其中T与T的属性不同T与T的属性顺序不一样
var T = new {Index = Name = CPUPrice = };
var T = new {Index = Title = MethodBoardPrice = };
var T = new {TIndex Price = Name = SoundCard };
匿名类型是不可变的也就是说匿名类型的实例是不能够更改它的属性的否则会造成编译错误如
var T = new {Index = Name = CPUPrice = };
TIndex = ;//引发编译错误
二隐式类型变量
隐式类型变量是用var关键字声明的局部变量这个变量的具体类型是可以通过赋傎号右边的表达式推导出来的其实在大多数情况下隐式类型变量都是为匿名类型的实例而存在的
隐式类型变量只能用于以下的场合
局部变量声明
forforeach 语句中变量声明
using 语句初始化变量
尤其要注意的是不能在类的字段中或方法的参数中使有隐式类型
那么问题是有没有办法在创建匿名类型的方法内部将其实例传到方法的外部呢?答案是肯定的主要有两种方法
利用object参数因为隐式类型变量可以自动转换为objcet
public void OutVarInstance(out object obj)//把匿名类型的实例传到方法外使用object
{
var v = new
{
Name = ZYS
Type = CEO
};
obj=v;
}
在这里隐式类型变量可以自动的转换为object类型当然对于调用者而言其操作仅限于object支持的那些
利用方法类型推导匿名类型的实例以一个方法的类型参数的形式来传递编译器可以推导出具体的类型
代码
public void OutVarInstance()//把匿名类型的实例传到方法外使用类型参数
{
var v = new {Title = Text = Ok};
Method(v);
}
public void Method<T>(T input)
{
ConsoleWriteLine(stringFormat(Text out {}input));
}
现在在Method中我们就可以对匿名类型的实例进行访问了