c# 4.0中动态的意图是什么?什么是“整洁”?它的用法

本文关键字:整洁 用法 什么 是什么 动态 意图 | 更新日期: 2023-09-27 17:49:55

正如标题所说…是否主要用于您不确切知道从方法调用返回的类型(可能是COM互操作)的实例?

c# 4.0中动态的意图是什么?什么是“整洁”?它的用法

这是一个我认为很好的改进的例子,它没有改变很多,但它是生活中的小事,使差异:)

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
    }