我正在从方法中返回IList<T>
。
在调用类中,我想在列表/堆栈的开头插入一个值。
在List<T>
中插入值比在Stack<T>
中推送值要慢。但是要使用堆栈,我需要将其拆箱。
所以问题是,取消包装还是在Insert
中使用List<T>
哪个更好?哪一个比较贵?
class MyClass
{
}
IList<MyClass> Method1()
{
}
class MainClass
{
List<MyClass> list = (List<MyClass>)Method1();
list.insert(0,new MyClass{...}); //insert at the start.
Stack<MyClass> stack = (Stack<MyClass>)Method1();
stack.Push(new MyClass{...}); //insert at the start
}
最佳答案
您不会在这两个版本中都取消装箱(尽管第一个不会编译..而第二个总是在运行时失败)-
但是,无论哪种情况,如果您进行转换,则只有在实际的基础实现是该类时,该转换才起作用。
如果您的方法返回IList<T>
,我强烈建议您坚持使用IList<T>
成员。将结果转换为List<T>
或Stack<T>
(即,无论内部实现是什么-都不是Stack<T>
,因为它没有实现IList<T>
)都是非常危险的。
返回IList<T>
的主要原因是有目的地允许您以后更改内部实现。内部的Method1
稍后可能会从List<T>
更改为其他IList<T>
,这将导致您的代码意外中断。
话虽这么说,如果您知道内部实现可能是某种类型,则可以进行检查-但我不会盲目地进行转换。