最近我们正在努力探讨以下哪项会更好。
我们的域有一个基类型,有很多继承自它的类:
public abstract class DomainBase
{
public int BaseId { get; set; }
}
在代码中的另一个位置,我们有一个方法,它接受一组对象并基于BaseId
工作。它不会返回对象,也不会使用给定的类型。
我的问题:在这里使用通用或者只是接受基类型会更好吗?
选项A:void DoWork<TDomainBase>(List<TDomainBase> objects) where TDomainBase : DomainBase;
选项B:void DoWork(List<DomainBase> objects);
在我们的代码中,这些被称为相同,因为我们从不使用具有不同类型的List<DomainBase>
集合(例如new List<DomainBase> { new Foo(), new Bar() }
)。我想说使用泛型更好,因此我们在将objects
传递给方法时不会隐式转换为它们的基类。但我想确保我不会错过这里明显的东西。 (或者,哎呀,无论我选择哪种选项,C#都可能只是优化所有这些!)很高兴被证明是错误的。
编辑删除不正确的陈述。
答案 0 :(得分:2)
&#34;两种选择都应该有效&#34; - 那么,几乎正确。
使用通用选项,您只需传递基本类型或任何类型的列表 直接从它派生到该方法的类型:
void DoWork<TDomainBase>(List<TDomainBase> objects) where TDomainBase : DomainBase
...
...
var list = new List<SomeClassDerivedFromDomainBase>() {/* initialize items */};
DoWork(list);
但是,使用基类列表,您将需要执行一个额外步骤并从派生类型列表中生成该列表:
void DoWork(List<DomainBase> objects);
var list = new List<SomeClassDerivedFromDomainBase>() {/* initialize items */};
DoWork(list); // This will cause a compilation error:
// Cannot implicitly convert type 'System.Collections.Generic.List<SomeClassDerivedFromDomainBase>' to 'System.Collections.Generic.List<DomainBase>'
Why can't I assign a List<Derived>
to a List<Base>
?
要解决这个问题,你必须做这样的事情:
DoWork(list.ToList<DomainBase>());
我认为现在应该很清楚,在这种情况下,通用选项更好。