为什么我们不能使用动态方法代替 Generic(T) 方法
Why can't we use dynamic methods instead for Generic(T) methods
我有两个函数定义如下。方法 1 将 return 任何动态类型,方法 2 将 return 泛型类型:
方法一
public dynamic dynamicFun(int n)
{
switch (n)
{
case 0:
return 0;
case 1:
return "N";
case 2:
return 1.3;
default:
return 'v';
}
}
方法二:
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)));
}
}
两者都在执行相同的功能。函数调用将在下图中进行描述:
现在我的问题是 ;
- 这两种方法有什么区别?
- 哪里可以使用动态方法,哪里可以使用泛型?
- 泛型比动态有什么优势吗?
为什么我们不能使用动态方法代替 [of] Generic(T) 方法?
在我看来你可以,你的例子和运行时值证明了这一点。但是您在思考示例时存在固有错误:您 知道 泛型方法中返回的是什么类型,因此您以这种方式实例化它。如果我做了 var genericCase1 = genericFun<int>(1)
,会返回什么?可能会抛出异常,因为 "N" 不是整数。
这两种方法有什么区别?
动态在运行时确定,而泛型在编译时解析。
哪里可以使用动态方法,哪里可以使用泛型?
我猜你可以在任何地方使用一种方法。你会使用一个而不是另一个的原因实际上是基于你所处的情况。如果你不知道在撰写本文时将返回给你的确切类型,那么请走动态路线。当您知道要处理几个具有特定方法的不同 base/super classes 时,您可以使用它,并且您想要使用该方法,但您不关心哪个派生 class 从动态方法返回。
泛型可用于避免为相同功能编写大量重载。如果你知道你想对许多不同的东西执行相同的操作,那么创建一个通用方法,并在你的写作过程中传递你想要做的事情的类型。使用类型约束也非常棒,因为现在您可以限制哪些类型可以调用此泛型方法,并在编译时发现任何问题。
泛型比动态有什么优势吗?
正如其他人在评论中所说,存在时间问题,一种方法可能比另一种方法花费更长的时间,但我想其中的一部分将取决于实现的方法,以及 JIT 与编译器的工作量要做。
泛型还允许类型安全和减少错误,因为它们是在编译时解决的。泛型也可能更容易维护,因为没有那么多 "magic" 进行。
您可能应该谨慎使用动态,因为尽管它们很强大,但使用不当可能会导致许多不眠之夜的调试。
如果我在这方面有任何错误,请有人纠正我。和我们大多数人一样,我也在学习,希望就我目前理解的任何问题提供反馈。
泛型的一大优点是您可以指定 T 的类型。例如void doSomething<T> () where T : abstractParentClass
我有两个函数定义如下。方法 1 将 return 任何动态类型,方法 2 将 return 泛型类型:
方法一
public dynamic dynamicFun(int n)
{
switch (n)
{
case 0:
return 0;
case 1:
return "N";
case 2:
return 1.3;
default:
return 'v';
}
}
方法二:
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)));
}
}
两者都在执行相同的功能。函数调用将在下图中进行描述:
现在我的问题是 ;
- 这两种方法有什么区别?
- 哪里可以使用动态方法,哪里可以使用泛型?
- 泛型比动态有什么优势吗?
为什么我们不能使用动态方法代替 [of] Generic(T) 方法?
在我看来你可以,你的例子和运行时值证明了这一点。但是您在思考示例时存在固有错误:您 知道 泛型方法中返回的是什么类型,因此您以这种方式实例化它。如果我做了 var genericCase1 = genericFun<int>(1)
,会返回什么?可能会抛出异常,因为 "N" 不是整数。
这两种方法有什么区别?
动态在运行时确定,而泛型在编译时解析。
哪里可以使用动态方法,哪里可以使用泛型?
我猜你可以在任何地方使用一种方法。你会使用一个而不是另一个的原因实际上是基于你所处的情况。如果你不知道在撰写本文时将返回给你的确切类型,那么请走动态路线。当您知道要处理几个具有特定方法的不同 base/super classes 时,您可以使用它,并且您想要使用该方法,但您不关心哪个派生 class 从动态方法返回。
泛型可用于避免为相同功能编写大量重载。如果你知道你想对许多不同的东西执行相同的操作,那么创建一个通用方法,并在你的写作过程中传递你想要做的事情的类型。使用类型约束也非常棒,因为现在您可以限制哪些类型可以调用此泛型方法,并在编译时发现任何问题。
泛型比动态有什么优势吗?
正如其他人在评论中所说,存在时间问题,一种方法可能比另一种方法花费更长的时间,但我想其中的一部分将取决于实现的方法,以及 JIT 与编译器的工作量要做。
泛型还允许类型安全和减少错误,因为它们是在编译时解决的。泛型也可能更容易维护,因为没有那么多 "magic" 进行。
您可能应该谨慎使用动态,因为尽管它们很强大,但使用不当可能会导致许多不眠之夜的调试。
如果我在这方面有任何错误,请有人纠正我。和我们大多数人一样,我也在学习,希望就我目前理解的任何问题提供反馈。
泛型的一大优点是您可以指定 T 的类型。例如void doSomething<T> () where T : abstractParentClass