最近,我开始倾向于使用Dictionaries
而不是Switch
语句来映射1-1关系。我发现它的编写速度更快,并且在心理上也更容易处理。不幸的是,当映射到对象的新实例时,我不想这样定义它:
var fooDict = new Dictionary<int, IBigObject>()
{
{ 0, new Foo() }, // Creates an instance of Foo
{ 1, new Bar() }, // Creates an instance of Bar
{ 2, new Baz() } // Creates an instance of Baz
}
var quux = fooDict[0]; // quux references Foo
有了这种构造,我浪费了CPU周期和内存来创建3个对象,而做它们的构造函数可能包含的一切,而最终只使用其中一个。我还相信,fooDict[0]
在这种情况下将其他对象映射到它们会导致它们引用同一事物,而不是Foo
按预期方式创建新的实例。一种解决方案是改用lambda:
var fooDict = new Dictionary<int, Func<IBigObject>>()
{
{ 0, () => new Foo() }, // Returns a new instance of Foo when invoked
{ 1, () => new Bar() }, // Ditto Bar
{ 2, () => new Baz() } // Ditto Baz
}
var quux = fooDict[0](); // equivalent to saying 'var quux = new Foo();'
这会变得太混乱了吗?最后很容易错过()
。还是映射到函数/表达式是很普遍的做法?另一种选择是使用一个开关:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
哪个调用更可接受?
- 字典,用于更快的查找和更少的关键字(大小写和中断)
- 开关:在代码中更常见,不需要间接使用Func <>对象。
fooDict[0] is fooDict[0]
)。使用lambda和switch都不是这种情况