เมื่อเร็ว ๆ นี้ฉันชอบทำแผนที่ความสัมพันธ์ 1-1 โดยใช้คำสั่งDictionaries
แทน Switch
ฉันคิดว่ามันจะเร็วขึ้นเล็กน้อยในการเขียนและง่ายต่อการประมวลผลทางจิตใจ น่าเสียดายที่เมื่อทำการแมปกับอินสแตนซ์ใหม่ของวัตถุฉันไม่ต้องการกำหนดเช่นนี้:
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
ตามที่ตั้งใจไว้ วิธีแก้ปัญหาคือใช้แลมบ์ดาแทน:
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]
) ด้วยแลมบ์ดาและสวิตช์นี่ไม่ใช่กรณี