gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 20:41:20 25 4
gpt4 key购买 nike

我有两个函数定义如下。方法一会动态返回任意类型,方法二会返回泛型:

方法一

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)));
}
}

两者都在执行相同的功能。函数调用将在下图中进行描述: enter image description here

现在我的问题是;

  • 这两种方法有什么区别?
  • 我们可以在哪些地方使用动态方法,在哪些地方可以使用泛型?
  • 通用比动态有什么优势吗?

最佳答案

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

在我看来你可以,你的例子和运行时值证明了这一点。但是您在考虑这些示例时存在固有错误:您知道您的泛型方法中返回的是什么类型,所以您以这种方式实例化它。如果我做了var genericCase1 = genericFun<int>(1) , 会返回什么?可能会抛出异常,因为“N”不是整数。

这两种方法有什么区别?

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

哪里可以使用动态方法,哪里可以使用泛型?

我猜你可以在任何地方使用方法。你会使用一个而不是另一个的原因实际上是基于你所处的情况。如果你不知道在撰写本文时将返回给你的确切类型,那么请走动态路线。当您知道要处理几个具有特定方法的不同基类/父类(super class),并且您想要使用该方法,但您不关心从动态方法返回哪个派生类时,您可以使用它。

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

泛型比动态有什么优势吗?

正如其他人在评论中所说,存在时间问题,一种方法可能比另一种方法花费更长的时间,但我想其中的一部分将取决于实现的方法,以及 JIT 与编译器必须完成的工作量.

泛型还允许类型安全和减少错误,因为它们是在编译时解决的。泛型也可能更容易维护,因为没有那么多“魔法”在发生。

您可能应该谨慎使用动态,因为尽管它们很强大,但使用不当可能会导致许多不眠之夜的调试。


如果我在这方面有任何错误,请有人纠正我。和我们大多数人一样,我也在学习,并希望就我目前的理解提出任何问题的反馈。

关于c# - 为什么我们不能使用动态方法代替 Generic(T) 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32537089/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com