ในภาษาที่ใช้งานได้ (เช่นเสียงกระเพื่อม) คุณใช้การจับคู่รูปแบบเพื่อกำหนดสิ่งที่เกิดขึ้นกับองค์ประกอบเฉพาะในรายการ การเทียบเท่าใน C # จะเป็นห่วงโซ่ของถ้า ... elseif งบที่ตรวจสอบประเภทขององค์ประกอบและดำเนินการตามที่ การจับคู่รูปแบบการทำงานนั้นมีประสิทธิภาพมากกว่าการตรวจสอบชนิดรันไทม์
การใช้ polymorphism จะเป็นการจับคู่รูปแบบที่ใกล้เคียงกันมากขึ้น นั่นคือการมีวัตถุของรายการตรงกับอินเทอร์เฟซเฉพาะและเรียกใช้ฟังก์ชันบนอินเทอร์เฟซนั้นสำหรับแต่ละวัตถุ อีกทางเลือกหนึ่งคือให้ชุดวิธีการโอเวอร์โหลดที่ใช้ชนิดวัตถุเฉพาะเป็นพารามิเตอร์ วิธีการเริ่มต้นการวัตถุเป็นพารามิเตอร์
public class ListVisitor
{
public void DoSomething(IEnumerable<dynamic> list)
{
foreach(dynamic obj in list)
{
DoSomething(obj);
}
}
public void DoSomething(SomeClass obj)
{
//do something with SomeClass
}
public void DoSomething(AnotherClass obj)
{
//do something with AnotherClass
}
public void DoSomething(Object obj)
{
//do something with everything els
}
}
วิธีนี้ให้การประมาณการจับคู่รูปแบบเสียงกระเพื่อม รูปแบบผู้เข้าชม (ตามที่ใช้ในที่นี้เป็นตัวอย่างที่ดีของการใช้งานสำหรับรายการที่ต่างกัน) อีกตัวอย่างหนึ่งคือการส่งข้อความโดยที่มีผู้ฟังสำหรับข้อความบางอย่างในคิวลำดับความสำคัญและการใช้ห่วงโซ่ความรับผิดชอบดิสแพตเชอร์ส่งข้อความและตัวจัดการแรกที่ตรงกับข้อความที่จัดการ
ด้านพลิกคือการแจ้งให้ทุกคนที่ลงทะเบียนข้อความ (ตัวอย่างเช่นรูปแบบ Event Aggregator ที่ใช้สำหรับการเชื่อมต่อแบบหลวมของ ViewModels ในรูปแบบ MVVM) ฉันใช้โครงสร้างต่อไปนี้
IDictionary<Type, List<Object>>
วิธีเดียวที่จะเพิ่มในพจนานุกรมคือฟังก์ชั่น
Register<T>(Action<T> handler)
(และวัตถุเป็นจริง WeakReference เพื่อส่งผ่านในการจัดการ) ดังนั้นที่นี่ฉันต้องใช้ List <Object> เพราะในเวลารวบรวมฉันไม่รู้ว่าประเภทปิดจะเป็นอย่างไร ที่ Runtime แต่ฉันสามารถบังคับให้เป็นประเภทนั้นซึ่งเป็นกุญแจสำคัญสำหรับพจนานุกรม เมื่อฉันต้องการไฟเหตุการณ์ที่ฉันเรียก
Send<T>(T message)
และอีกครั้งฉันแก้ไขรายการ ไม่มีข้อได้เปรียบในการใช้ List <dynamic> เพราะฉันต้องการส่งต่อไป ดังนั้นอย่างที่คุณเห็นมีข้อดีสำหรับทั้งสองวิธี หากคุณกำลังจะส่งวัตถุแบบไดนามิกโดยใช้วิธีการบรรทุกเกินพิกัดแบบไดนามิกเป็นวิธีที่จะทำ หากคุณถูกบังคับให้ต้องทำการแคร์โดยไม่คำนึงถึงก็อาจใช้ Object ได้เช่นกัน