为什么我们不能使用动态方法代替Generic(T)方法

时间:2015-09-12 09:06:48

标签: c# .net function generics dynamic

我有两个定义如下的函数。方法1将动态返回任何类型,方法2将返回泛型类型:

方法1

public dynamic dynamicFun(int n)
        {
            switch (n)
            {
                case 0:
                    return 0;
                case 1:
                    return "N";
                case 2:
                    return 1.3;
                default:
                    return 'v';
            }
        }

方法2:

  public static T genericFun<T>(int n)
        {
            switch (n)
            {
                case 0:
                    return (T)System.Convert.ChangeType(0, Type.GetTypeCode(typeof(T)));
                case 1:
                    return (T)System.Convert.ChangeType("N", Type.GetTypeCode(typeof(T)));
                case 2:
                    return (T)System.Convert.ChangeType(1.3, Type.GetTypeCode(typeof(T)));
                default:
                    return (T)System.Convert.ChangeType('V', Type.GetTypeCode(typeof(T)));
            }
        }

两者都在做同样的功能。函数调用将在下图所示的图像中描述: enter image description here

现在我的问题是;

  • 这两种方法有什么区别?
  • 哪里可以使用动态方法,哪里可以使用泛型?
  • 通用动态是否有任何优势?

2 个答案:

答案 0 :(得分:4)

为什么我们不能使用动态方法而不是通用(T)方法?

在我看来,您可以通过您的示例和运行时值来证明。但是你的想法中存在一个固有的错误:你知道你的泛型方法中返回的是什么类型,所以你以这种方式实例化它。如果我做var genericCase1 = genericFun<int>(1),会返回什么?可能会引发异常,因为&#34; N&#34;不是整数。

这两种方法有什么区别?

动态在运行时确定,而泛型在编译时解析

我们可以使用动态方法和可以使用泛型的地方吗?

我猜你可以使用任何方法。你使用一个在另一个上面的原因实际上是基于你所处的情况。如果你不知道在写这篇文章时会给你的确切类型,那么就去动态路线。当您知道处理具有特定方法的几个不同的基类/超类并且您想要使用该方法时,可以使用此方法,但是您不关心从动态方法返回哪个派生类。

泛型可用于避免为相同的功能编写大量重载。如果您知道要对许多不同的事物执行相同的操作,那么创建一个通用方法,并在您的写作过程中传递您想要做的事情。使用类型约束也非常棒,因为现在您可以限制哪些类型能够调用此泛型方法,并在编译时实现任何问题。

通用动态是否有任何优势?

正如其他人在评论中所说,有时间问题,一种方法可能需要比另一种方法更长的时间,但我认为其中的一部分将由实施的方法确定,以及JIT与编译器必须完成的工作量

泛型也可以允许类型安全和减少错误,因为它们在编译时得到解决。仿制药也可能更容易维护,因为没有那么多的魔法&#34;继续

你应该谨慎使用动态,因为虽然它们功能强大,但使用不当会导致许多不眠之夜的调试。

如果我对此有任何不妥之处,请有人纠正我。我们大多数人都在那里,我也在学习,并希望通过我目前的理解对任何问题提供反馈。

答案 1 :(得分:0)

泛型的一大优点是你可以指定T.的类型。 void doSomething<T> () where T : abstractParentClass