2009-03-26 32 views
16

Trường tĩnh trong một lớp chung sẽ có một giá trị riêng biệt cho mỗi kết hợp các tham số chung. Do đó, có thể được sử dụng như một từ điển < Type, bất cứ điều gì >Lớp chung tĩnh như từ điển

là tốt hơn này hoặc tệ hơn là một tĩnh từ điển < Type, bất cứ điều gì >?

Nói cách khác, triển khai nào trong số những triển khai này hiệu quả hơn?

public static class MethodGen<TParam> { 
    public static readonly Action<TParam> Method = CreateMethod(); 
    static Action<TParam> CreateMethod() { /*...*/ } 
} 

Hoặc,

public static class MethodGen { 
    static readonly Dictionary<Type, Delegate> methods 
       = new Dictionary<Type, Delegate>(); 

    public static Action<T> GetMethod<T>() { 
     //In production code, this would ReaderWriterLock 

     Delegate method; 
     if(!methods.TryGetValue(typeof(T), out method) 
      methods.Add(typeof(t), method = CreateMethod<T>()); 
     return method; 
    } 

    static Action<T> CreateMethod<T>() { /*...*/ } 
} 

Đặc biệt, làm thế nào CLR tra cứu các lĩnh vực tĩnh bởi tham số kiểu chung chung?

+0

cách bạn triển khai Hành động tĩnh của mình CreateMethod ()? –

+0

Và ngay khi tôi đang nghĩ về nó! +1 – nawfal

Trả lời

12

Tôi thích sử dụng các loại chung chung theo cách này. Đặc biệt, tôi thường có các lớp chung chung lồng nhau cho chính xác mục đích này.

Điều chính tôi thích về nó là khó không để nhận được quyền khởi tạo theo cách này (về an toàn luồng), do cách khởi tạo kiểu hoạt động. Vấn đề duy nhất là phải làm gì nếu khởi tạo thất bại - thỉnh thoảng tôi đã sử dụng để nhớ một ngoại lệ để ném vào lần truy cập cần thiết đầu tiên, nhưng điều đó khá hiếm.

tôi không muốn đoán tại chính xác cách CLR nhìn lên loại thông qua các đối số loại, nhưng tôi khá chắc chắn nó sẽ được tối ưu hóa để heck và back :)

1

Nó không lưu trữ các giá trị cho mỗi tham số kiểu chung chung nhiều như nó thực sự tạo ra (khái niệm anyways) N lớp riêng biệt - một cho mỗi loại T mà bạn sử dụng nó.

+0

Hmmm ... Bạn có chắc chắn điều đó đúng không? Tôi nghĩ rằng nó chỉ làm một lớp cho tất cả các loại tham chiếu, và sau đó một cho mỗi loại giá trị bạn có thể sử dụng nó. –

+2

Nó sử dụng một bản sao mã gốc cho tất cả các loại tham chiếu, nhưng có các đối tượng Kiểu riêng biệt. –

1

Tôi tin rằng phiên bản chung (đầu tiên) sẽ thực hiện tra cứu từ điển tại thời gian biên dịch, và do đó thực hiện tốt hơn khi chạy.

Tuy nhiên, nó có thể sử dụng nhiều bộ nhớ hơn.

2

Tôi chưa lược tả nó (đó là cách duy nhất để thực sự trả lời câu hỏi này - sự khác biệt về hiệu suất có thể quá nhỏ để vô nghĩa) nhưng tôi sẽ nguy hiểm khi đoán khóa là phần đắt tiền. CLR thực hiện khóa cho bạn - và thực hiện theo cách được các chuyên gia trong lĩnh vực này xác định! - vì vậy tôi mong đợi nếu có một sự khác biệt, nó sẽ có lợi cho việc sử dụng các tính năng ngôn ngữ hơn là xây dựng nó cho mình với Dictionary + khóa.

Các vấn đề liên quan