一、概述
本篇主要讲匿名类的用法,匿名类相对于普通的类来说最大的优点就是方便,无需提前声明,需要用到的时候随时可以创建一个相应类型的对象,无需提前创建任何东西,这使得代码编写的过程变得异常灵活与方便。
二、类的声明与创建
在讲匿名类之前我们需要先了解普通类是如何创建的。
1.类的创建
class test
{
public int x = 0;
public int y = 1;
public string text = "123";
}
这里创建了一个test类,类里面定义了三个变量
2.类的实例化
test ts = new test();
3.或者定义实例化类型的初始变量
test ts = new test() { x=2,y=3,text="456"};
4.再进一步修改
var ts = new test() { x=2,y=3,text="456"};
在这里c#为了简化我们的代码编写,并使得编码变得更加灵活,就允许创建一个临时的类,无需进行任何的提前声明,并且编译器会自动找到最合适的变量类型来承接匿名类中的变量.
var ts=new {x = 2, y = 3, text = "456" };
这样声明出来的类统称为匿名类.匿名类只能用泛型来进行承接,调用匿名类中的变量时与非匿名类完全相同,编译器会自动匹配到相应的变量.
var ts = new { x=2,y=3,text="456"};
int x = ts.x;
但是这样出来的匿名类无法直接以参数的形式传递到其他的方法中,因为泛型var无法直接当做参数的类型来进行方法之间的数据传递工作因此我这里考虑用dynamic来进行数据的接收.
dynamic是一个很特殊的类型,编译器不会检测dynamic修饰的变量的正确性,因此我们可以用dynamic来接收匿名类的参数,并且可以直接调用匿名类中的变量而不会报错.
var ts = new { x=2,y=3,text="456"};
test(ts);
public static void test(dynamic ts)
{
int x= ts.x;
}
dynamic在.net4.0以上的版本才能使用,在使用dynamic的时候可能会报异常 预定义的类型“Microsoft.CSharp.RuntimeBinder.Binder”未定义或未导入
解决方法
以文本的方式打开项目文件(.csproj)并在ItemGroup节点加入如下语句,重新打开项目即可:
<Reference Include="Microsoft.CSharp" />
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="System.Data" />
<Reference Include="System.Xml" />
<Reference Include="Microsoft.CSharp" />
</ItemGroup>
三、匿名类存在的意义
匿名类在很大程度上方便了代码的编写工作,并在某些地方增加了代码的可阅读性,此外匿名类也作为linq表达式的重要输出手段.