dynamic和匿名类型结合
经常使用js的朋友会发现,我们经常需要返回一些‘临时’的类型的实例。举个例子,当我们在定位一个元素时,我们的方法的结束处可能会是这样:
function getOffset(obj)
{
...
var offset = new object();
offset.top = top;
offset.left = left;
return offset;
}
{
...
var offset = new object();
offset.top = top;
offset.left = left;
return offset;
}
得益于js的动态特性,我们不用再去定义一个包含top和left属性的类型。然而在C#中,我们却不得不去定义这样一个类型,尽管这个类型可能就使用那么一次。
不过,在C# 4.0里,ms为我们引入了dynamic,这决定了我们可以如同使用js一般来使用C#。
比如上面这个问题,我们可以使用dynamic和匿名类型来实现:
private dynamic GetOffset()
{
...
dynamic offset= new{Top = top, Left=left};
return offste;
}
{
...
dynamic offset= new{Top = top, Left=left};
return offste;
}
这样一来是不是方便了不少?
当然,dynamic引入的问题就是如果使用了dynamic类型不包含的属性在编译时并不会被发现,而在运行时则会以异常的形式表现出来。这也是让我觉得在使用时畏首畏尾的缘由。不过,个人认为C#不适宜过多的采用动态语言的编程方式。而一旦用了则一定要做好注释,比如上面的方法只要对返回值多详细的说明我相信就不会出现被人无用的情形。
