Gần đây, tôi đã thích lập bản đồ các mối quan hệ 1-1 bằng cách sử dụng Dictionaries
thay vì các Switch
câu lệnh. Tôi thấy nó nhanh hơn một chút để viết và dễ dàng xử lý hơn về mặt tinh thần. Thật không may, khi ánh xạ tới một thể hiện mới của một đối tượng, tôi không muốn định nghĩa nó như thế này:
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
Với cấu trúc đó, tôi đã lãng phí chu kỳ CPU và bộ nhớ để tạo 3 đối tượng, làm bất cứ thứ gì mà các hàm tạo của chúng có thể chứa và chỉ kết thúc bằng một trong số chúng. Tôi cũng tin rằng việc ánh xạ các đối tượng khác fooDict[0]
trong trường hợp này sẽ khiến chúng tham chiếu cùng một thứ, thay vì tạo ra một thể hiện mới Foo
như dự định. Một giải pháp sẽ là sử dụng lambda thay thế:
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();'
Đây có phải là đến một điểm mà nó quá khó hiểu? Thật dễ dàng để bỏ lỡ điều đó ()
vào cuối. Hoặc là ánh xạ tới một chức năng / biểu thức là một thực tế khá phổ biến? Thay thế sẽ là sử dụng một công tắc:
IBigObject quux;
switch(someInt)
{
case 0: quux = new Foo(); break;
case 1: quux = new Bar(); break;
case 2: quux = new Baz(); break;
}
Lời mời nào được chấp nhận hơn?
- Từ điển, để tra cứu nhanh hơn và ít từ khóa hơn (trường hợp và phá vỡ)
- Chuyển đổi: Thường được tìm thấy trong mã, không yêu cầu sử dụng đối tượng Func <> để xác định.
fooDict[0] is fooDict[0]
). với cả lambda và công tắc, đây không phải là trường hợp