C#4.0"动态"关键字是否会使泛型多余?

and*_*ndy 9 .net c# generics reflection dynamic

我对C#中的动态特性感到非常兴奋(C#4动态关键字 - 为什么不呢?),特别是因为在我的代码的某些库部分我使用了很多反射.

我的问题是双重的:

1."动态"取代泛型,如下面的情况?

泛型方法:

public static void Do_Something_If_Object_Not_Null<SomeType>(SomeType ObjToTest) {

        //test object is not null, regardless of its Type
        if (!EqualityComparer<SomeType>.Default.Equals(ObjToTest, default(SomeType))) {
            //do something
        }
    }
Run Code Online (Sandbox Code Playgroud)

动态方法(??):

public static void Do_Something_If_Object_Not_Null(dynamic ObjToTest) {

        //test object is not null, regardless of its Type?? but how?
        if (ObjToTest != null) {
            //do something
        }
    }
Run Code Online (Sandbox Code Playgroud)

2."动态"现在是否允许方法返回匿名类型,如下面的情况?:

 public static List<dynamic> ReturnAnonymousType() {
        return MyDataContext.SomeEntities.Entity.Select(e => e.Property1, e.Property2).ToList();
    }
Run Code Online (Sandbox Code Playgroud)

很酷,欢呼

编辑:

仔细考虑了我的问题,并根据答案,我看到我完全搞砸了主要的通用/动态问题.他们的确完全不同.所以是的,感谢所有的信息.

那么第2点怎么样?

Gis*_*shu 17

回答你的问题.没有.

  • 泛型为您提供" 算法重用 " - 您可以编写独立于数据类型的代码.dynamic关键字不会执行与此相关的任何操作.我定义List<T>,然后我可以使用它的字符串列表,整数等...
  • 类型安全:整个编译时间检查辩论.动态变量不会通过编译时警告/错误提醒您,如果您犯了错误,如果您尝试调用的方法丢失,它们将在运行时爆炸.静态与动态类型争论
  • 性能:泛型使用值类型提高了算法/代码的性能了很多个数量级.它可以防止整个拳击 - 拆箱周期花费我们预先仿制药.Dynamic也没有为此做任何事情.

什么dynamic关键字会给你是

  • 更简单的代码(当您与Excel进行互操作时,可以说..)您不需要指定类的名称或对象模型.如果调用正确的方法,则运行时将负责调用该方法(如果该方法当时存在).即使未定义方法,编译器也可让您逃脱.但是,这意味着这将比进行编译器验证/静态类型的方法调用慢,因为CLR必须在进行动态var字段/方法调用之前执行检查.
  • 动态变量可以在不同的时间点保存不同类型的对象 - 您不受特定系列或对象类型的约束.


Mar*_*ell 17

dynamic可能会简化有限数量的反射场景(你事先知道成员名称,但没有接口) - 特别是,它可能有助于泛型运算符(尽管存在其他答案) - 但除了泛型运算符技巧之外,与泛型几乎没有交叉.

泛型允许您(在编译时)知道您正在使用的类型 - 相反,dynamic关心类型.特别是 - 泛型允许您指定和证明关于类型的许多条件- 即它可能实现某个接口,或者具有公共无参数构造函数.dynamic两者都没有帮助:它不支持接口,而不仅仅是不关心接口,这意味着我们甚至看不到明确的接口实现dynamic.

另外,dynamic真的是一个特例object,所以拳击发挥作用,但有一个疏远.

实际上,您应该限制使用dynamic几种情况:

  • COM互操作
  • DLR互操作
  • 也许是一些轻鸭子打字
  • 也许是一些通用运营商

对于所有其他情况,泛型和常规C#是要走的路.


Pet*_*den 8

为了回答你的第一个问题,泛型在运行时解析编译时,动态类型.因此,在类型安全性和速度方面存在明显差异.

  • 为了完整性,.NET中的泛型由运行时提供,如果需要,可以在运行时指定泛型类型参数. (2认同)

Ste*_*ger 6

动态类和泛型是完全不同的概念.使用泛型,您可以在编译时定义类型.它们不会改变,它们不是动态的.您只需将"占位符"放入某个类或方法,以使调用代码定义类型.

动态方法在运行时定义.那里没有编译时类型安全.动态类类似于对象引用和使用反射通过其字符串名称调用方法.