c# 4.0中动态的意图是什么?什么是“整洁”?它的用法
本文关键字:整洁 用法 什么 是什么 动态 意图 | 更新日期: 2023-09-27 17:49:55
正如标题所说…是否主要用于您不确切知道从方法调用返回的类型(可能是COM互操作)的实例?
这是一个我认为很好的改进的例子,它没有改变很多,但它是生活中的小事,使差异:)
http://weblogs.asp.net/gunnarpeipman/archive/2010/07/27/asp-net-mvc-3-new-viewmodel-is-dynamic-viewdata.aspx正如您所提到的,它使与动态语言的互操作变得更加容易。
对我来说,这通常意味着javascript。我最喜欢的一种用法是在服务器上使用JSON而不定义dto——这也使LINQ能够使用JSON:
JsonObject body;
string[] favoriteToys =
(from child in (JsonValue)body.AsDynamic().Children
where child.Value.AsDynamic().Name.ReadAs<string>(string.Empty).StartsWith("J")
select child.Value.AsDynamic().BestToy.ReadAs<string>("No favorite toy"))
.ToArray();
(示例代码摘自" ok, WCF,我们现在可以成为朋友了",请务必查看"WCF支持jQuery on wcf.codeplex.com")
如果你完全不知道一个变量的类型,或者你想允许用户指定一个类在运行时加载和使用c#反射API来加载它,然后你可以使用动态类型,用户不需要他们班来自任何东西,但是只需要定义特定的方法(如果不将抛出一个异常和错误打印异常,告诉用户发生了什么)。
它们在您不知道返回类型的情况下很有用,或者您在编译时不知道对象上有哪些成员可用,因此您可以将其推迟到运行时。动态的另一个简洁用法是ExpandoObject
。这允许您在运行时向对象添加成员。我用它来代替Dictionary<string, object>
风格的代码。
是的,COM互操作可能是动态非常有用的最常见的地方。我将它与IronPython结合使用,使对python方法(本质上是动态脚本)的调用更清晰、更容易。这些都是它的目的。
也就是说,引入动态的总体效果是使c#成为一种脚本语言,并且很有可能它将沿着这条路线用于许多其他目的(这让语言纯粹主义者非常恐惧)。例如,ViewBag
属性在MVC 3只是一个动态包装ViewData集合。它使语法看起来更"干净"(ViewBag.FirstName
而不是ViewData["FirstName"]
),但潜在的代价是清晰度:乍一看,c#开发人员可能会认为前者是对某种强类型对象的属性的访问,当没有编译器错误时,这会给他们一种错误的安全感。
我也听说过一些框架可以将JSON字符串反序列化为动态对象,这样你的。net系统就可以像javascript处理AJAX请求一样处理动态javascript对象。对一些人来说,这真的很酷,但对另一些人来说,至少有一点令人毛骨悚然。
动态的一个"酷"的事情是不使用访问者模式的多重分派。
public class Fruit {}
public class Apple : Fruit {}
public class GrannySmith : Apple {}
public class FruitSalad
{
public void Mix(Apple apple) {
Console.WriteLine("mixing a apple");
}
public void Mix(GrannySmith apple) {
Console.WriteLine("mixing a Granny-Smith apple");
}
public void Mix(Fruit fruit) {
Console.WriteLine("unknown fruit, can't mix!");
}
}
public static void Main(string[] args)
{
var salad = new FruitSalad();
Fruit fruit = new Apple();
salad.Mix(fruit); // unknown fruit, can't mix
// (can't resolve onm the type of parameter)
dynamic fruit2 = new Apple();
salad.Mix(fruit2); // mixing a apple
// with dynamic, the parameter's resolution
// is deferred to runtime, so now we know it's an apple
}