C# 类型比较性能:TryCast与GetType

C# 类型比较性能:TryCast与GetType,c#,C#,我想知道的是,在确定哪个子类实际被传递到函数中时,什么是最佳性能 以下是我为获得最佳性能而选择的3种不同方式: (ACHData、CCData和DC数据都继承自BaseData) 我会重新考虑你的整个设计。让您的类实现一个接口,强制它们选择作为处理器提供什么: public interface IKnowWhatProcessorIWant { IProcessor CreateProcessor(); } public class ACHData : BaseData, IKnowW

我想知道的是,在确定哪个子类实际被传递到函数中时,什么是最佳性能

以下是我为获得最佳性能而选择的3种不同方式: (ACHData、CCData和DC数据都继承自BaseData)


我会重新考虑你的整个设计。让您的类实现一个接口,强制它们选择作为处理器提供什么:

public interface IKnowWhatProcessorIWant {
    IProcessor CreateProcessor();
}

public class ACHData : BaseData, IKnowWhatProcessorIWant {
    public IProcessor CreateProcessor() {
        return new GetACHProcessor(this);
    }
}
然后您的
GetProcessor
代码变成:

public BaseProcessor GetProcessor(IKnowWhatProcessorIWant obj) {
    return obj.CreateProcessor();
}

…或者,您可以完全忽略该方法。

我感觉我们将看到很多“您需要对其进行基准测试!”的评论/答案。说真的,只有你才能运行基准测试。当你所做的只是检查基类的类型并在方法中向上转换它时,让你的方法接受基类是没有意义的。你应该重新审视你的设计,并考虑一些多态性/泛型。我同意Jeroen Vannevel的观点,你应该重新设计。但是,我要补充的是,如果您必须使用这种方法,那么最好的性能可能是在基类上创建一个“ProcessorType”和一个相应的抽象属性。然后可以在GetProcessor方法中使用开关块。例如,System.Linq.Expressions.Expression及其子类使用此模式。在这一点上,我不知道我想要什么处理器,这就是为什么我有这个方法。我希望能够编写一个“DoSale”方法来收集支付信息,然后只执行var sale=ProcessorFactory.GetProcessor(paymentInfo);销售。信贷();这样做的全部目的是消除对工厂的需求。你的对象自己决定他们想要什么处理器。在看了更多之后,我理解了你想要得到什么。我并没有完全使用接口,但我只使用了一个抽象类,实现了同样的功能。现在我根本不需要做任何类型比较。谢谢你的启示!没问题。很高兴我能帮忙:)
public BaseProcessor GetProcessor(IKnowWhatProcessorIWant obj) {
    return obj.CreateProcessor();
}