我有两个定义如下的函数。方法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)));
}
}
现在我的问题是;
答案 0 :(得分:4)
在我看来,您可以通过您的示例和运行时值来证明。但是你的想法中存在一个固有的错误:你知道你的泛型方法中返回的是什么类型,所以你以这种方式实例化它。如果我做var genericCase1 = genericFun<int>(1)
,会返回什么?可能会引发异常,因为&#34; N&#34;不是整数。
动态在运行时确定,而泛型在编译时解析。
我猜你可以使用任何方法。你使用一个在另一个上面的原因实际上是基于你所处的情况。如果你不知道在写这篇文章时会给你的确切类型,那么就去动态路线。当您知道处理具有特定方法的几个不同的基类/超类并且您想要使用该方法时,可以使用此方法,但是您不关心从动态方法返回哪个派生类。
泛型可用于避免为相同的功能编写大量重载。如果您知道要对许多不同的事物执行相同的操作,那么创建一个通用方法,并在您的写作过程中传递您想要做的事情。使用类型约束也非常棒,因为现在您可以限制哪些类型能够调用此泛型方法,并在编译时实现任何问题。
正如其他人在评论中所说,有时间问题,一种方法可能需要比另一种方法更长的时间,但我认为其中的一部分将由实施的方法确定,以及JIT与编译器必须完成的工作量
泛型也可以允许类型安全和减少错误,因为它们在编译时得到解决。仿制药也可能更容易维护,因为没有那么多的魔法&#34;继续
你应该谨慎使用动态,因为虽然它们功能强大,但使用不当会导致许多不眠之夜的调试。
如果我对此有任何不妥之处,请有人纠正我。我们大多数人都在那里,我也在学习,并希望通过我目前的理解对任何问题提供反馈。
答案 1 :(得分:0)
泛型的一大优点是你可以指定T.的类型。 void doSomething<T> () where T : abstractParentClass