【问题标题】:Fastest way to check an objects type [duplicate]检查对象类型的最快方法[重复]
【发布时间】:2020-07-01 12:39:22
【问题描述】:

在 C# 中检查对象类型的最快方法是什么?

似乎有很多方法可以做到这一点;因为,是,GetType(),typeof,我想要最快的。 我拥有的对象很简单,无需担心继承。

这是它需要如何工作的伪代码:

if (x == ClassY) 
{
    doYStuff();
    return
}

if (x == ClassZ) 
{
    doZStuff();
    return
}

Repeat a lot with other Class types...

欢迎提出建议,希望你们一切都好。

谢谢。

【问题讨论】:

  • 我的建议是 (1) 编写基准测试并 (2) 访问 google。--顺便说一句,代码有异味。这样的选择通常应该通过多态性(通过不同的接口实现)来做出。
  • 谢谢彼得。所有好的建议。可悲的是,我的谷歌搜索不是确定的。而且我猜其他人会知道答案,所以编写自己的基准测试似乎有点傻。我同意气味,它看起来不漂亮。但这是我必须处理的。塔。
  • 所以你不能改变类层次结构?我的意思是,改变 ClassX 和 ClassY 的定义?顺便说一句,即使不是:使用 doStuff() 方法创建一个单独的接口并提供您自己的实现类,这些实现类包含(或可能继承)ClassX、Y、Z,在它们的调用 doX,Y,ZStuff()实现doStuff,然后传递具有接口类型的xs,并简单地调用doStuff(),无需任何if或switch。
  • 请注意,有很多旧帖子都在问同样的问题,例如Fastest Type Comparison?What is the fastest way to check a type?。但是,我找不到一个对所有可能的方法都进行彻底基准测试的方法。如果我没有错过任何一个并且这篇文章得到了完整的答案,那么有足够权限的人应该考虑关闭其中一些重复项。

标签: c#


【解决方案1】:

如果您担心性能,那么检查类型绝不是一个好主意。您应该看看是否可以编写代码,以便它们从具有doStuff 方法的公共基础派生,然后让派生类覆盖该方法。例如:

abstract class Base
{
    public abstract void DoStuff();
}

class ClassX : Base
{
    public override void DoStuff()
    {
        Console.WriteLine("ClassX DoStuff");
    }
}

class ClassY : Base
{
    public override void DoStuff()
    {
        Console.WriteLine("ClassY DoStuff");
    }
}

现在你可以说:

x.DoStuff();

而且不必担心检查类型。这也意味着每次出现需要处理的新类型时,您不必不断更改 if 语句。

但是,如果您打算检查类型,那么简洁的方法是使用 switch 语句:

switch(x)
{
    case ClassX classX:
        Console.WriteLine("ClassX");
        break;

    case ClassY classy:
        Console.WriteLine("ClassY");
        break;
}

【讨论】:

  • 您可能希望 ClassY 说“ClassY DoStuff”;-)
  • @Peter-ReinstateMonica - 你说得对,谢谢!
  • 如果您无权访问 ClassX、Y、Z 等,可以通过包含或继承它们并将每个 doStuff() 调用间接到现有的特定类方法来完成类似的操作。
【解决方案2】:

使用 is 运算符,https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/is

if (x is ClassY) 
{
    doYStuff();
    return
}

if (x is ClassZ) 
{
    doZStuff();
    return
}

它也可以用来检查实现

if (x is IClassY) 
{
    doYStuff();
    return
}

if (x is IClassZ) 
{
    doZStuff();
    return
}

【讨论】:

  • 但是您是否同意这通常表明存在设计问题?在这种情况下,请在您的帖子中包含该警告,并可能勾勒出替代方案。您知道,现在有 200 名初学者正在从 stackoverflow 复制此内容。
  • @Peter-ReinstateMonica 可能但又可能不是设计问题。我想说,如果您正在编写新的东西,您应该尝试遵守单一职责原则,但在许多情况下,开发人员正在现代化和维护旧应用程序,而 SRP 不是一个选项。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-04-01
  • 2020-04-27
  • 2011-12-15
  • 1970-01-01
  • 2014-02-17
  • 2016-12-01
相关资源
最近更新 更多