Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C4.0中动力学的意图是什么?它有什么“巧妙”的用途?_C#_Dynamic - Fatal编程技术网

C# C4.0中动力学的意图是什么?它有什么“巧妙”的用途?

C# C4.0中动力学的意图是什么?它有什么“巧妙”的用途?,c#,dynamic,C#,Dynamic,正如标题所说。。。它主要用于您不知道从方法调用COM interop可能返回什么类型的实例吗?是的,COM interop可能是最常见的动态非常有用的地方。我将它与IronPython结合使用,以调用python方法,这些方法本质上是动态脚本,更简洁、更容易。这些都是它的初衷 这就是说,引入动态的总体效果是使C成为一种脚本语言,而且很有可能它将被用于许多其他用途,这让语言纯粹主义者感到恐惧。例如,MVC 3中的ViewBag属性只是ViewData集合的动态包装。它使语法看起来只是一个稍微干净的

正如标题所说。。。它主要用于您不知道从方法调用COM interop可能返回什么类型的实例吗?

是的,COM interop可能是最常见的动态非常有用的地方。我将它与IronPython结合使用,以调用python方法,这些方法本质上是动态脚本,更简洁、更容易。这些都是它的初衷

这就是说,引入动态的总体效果是使C成为一种脚本语言,而且很有可能它将被用于许多其他用途,这让语言纯粹主义者感到恐惧。例如,MVC 3中的ViewBag属性只是ViewData集合的动态包装。它使语法看起来只是一个稍微干净的ViewBag.FirstName,而不是ViewData[FirstName],但这可能会降低清晰度:乍一看,C开发人员可能会认为前者是对某种强类型对象上属性的访问,这在没有编译器错误的情况下会给他们错误的安全感


我还听说过一些框架可以将JSON字符串反序列化为动态对象,因此您的.NET系统可以用javascript处理AJAX请求的方式处理动态javascript对象。对于某些人来说,它真的很酷,而对于其他人来说,它至少有点让人毛骨悚然。

如果您不确切知道变量的类型,或者您想让用户指定一个在运行时加载的类并使用C反射API来加载它,那么您可以使用动态类型,这样用户就不需要从任何东西派生他们的类,但只需要定义某些方法,否则将引发异常,并从异常中打印错误以告知用户发生了什么


这样做的好处是用户键入的内容更少,因此用户出错的空间也更少。

在您不知道返回类型,或者在编译时不知道对象上有哪些成员可用的情况下,它们非常有用,因此您可以将其推迟到运行时。dynamic的另一个巧妙用法是。这允许您在运行时向对象添加成员。我用它来代替字典样式的代码。

这里有一个例子,我认为它是一个很好的改进,它并没有很大的改变,但它是生活中的小事情,有不同之处:


使用dynamic可以获得的一个很酷的东西是没有访问者模式的多分派

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

    }

正如您所提到的,它使与动态语言的互操作更加容易

对我来说,这通常意味着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();

从中提取示例代码,并确保看到

Nice。。。我也开始使用ExpandoObjects。。。我喜欢我能把一些迟来的束缚推到物体上。我通常必须返回并添加到POCO中,或者根本不放入对象中。@Chad:它还实现了显式的IDictionary接口,这使得将现有字典对象转换为ExpandooObject非常容易。感谢链接。生活中的点点滴滴肯定会带来很大的不同;很棒,很好的例子。。。谢谢你花时间发布。不客气。然而,使用dynamic的缺点是,你放弃了类型安全。哦,这很好。谢谢分享。可能是的副本