2008-09-11 34 views
18

Đó là shown rằng 'làm' quá trình truyền nhanh hơn nhiều so với đúc tiền tố, nhưng phản ánh 'là' là gì? Nó tệ đến mức nào? Như bạn có thể hình dung, tìm kiếm 'is' trên Google không hiệu quả khủng khiếp.Đặc tính hiệu suất của sự phản chiếu 'là' trong C# là gì?

+2

'là' rất nhanh. –

+0

Tôi nhận thấy ngày đó không phải là yếu tố quyết định duy nhất trong việc đóng các câu hỏi trùng lặp, nhưng câu hỏi của tôi đã được đăng và trả lời và upvoted tất cả trước khi câu hỏi khác được đăng. _It_ là bản sao, không phải bản sao này. –

Trả lời

19

Có một vài lựa chọn:

  1. Các cổ điển đúc: Foo foo = (Foo)bar
  2. Các as dàn diễn viên hành: Foo foo = bar as Foo
  3. Các is kiểm tra: bool is = bar is Foo

  1. Các diễn viên điển cần phải kiểm tra xem bar có thể được an toàn đúc để Foo (nhanh), và sau đó thực sự làm điều đó (chậm hơn), hoặc ném một ngoại lệ (rất chậm).
  2. Nhà cung cấp as cần kiểm tra xem bar có thể được truyền, sau đó thực hiện hoặc không thể truyền an toàn, sau đó chỉ trả lại null.
  3. Nhà cung cấp is chỉ kiểm tra xem bar có thể được truyền tới Foo và trả lại boolean hay không.

Kiểm tra is nhanh vì nó chỉ thực hiện phần đầu tiên của thao tác đúc hoàn toàn. Nhà điều hành as nhanh hơn dàn diễn viên cổ điển vì không ném ngoại lệ nếu dàn diễn viên không thành công (điều này làm cho các trường hợp bạn cho rằng hợp pháp có thể thất bại).

Nếu bạn chỉ cần biết nếu biến bar là một Foo sau đó sử dụng các nhà điều hành is, NHƯNG, nếu bạn đang đi để kiểm tra nếu bar là một Foo, và nếu như vậy, sau đó cast nó, sau đó bạn nên sử dụng toán tử as.

Về cơ bản, mọi diễn viên cần thực hiện tương đương với số is kiểm tra nội bộ để bắt đầu, để đảm bảo rằng dàn diễn viên hợp lệ. Vì vậy, nếu bạn thực hiện kiểm tra is, sau đó là một dàn diễn viên đầy đủ (hoặc là as dàn diễn viên hoặc với nhà điều hành dàn diễn viên cổ điển), bạn sẽ thực hiện kiểm tra is hai lần một cách hiệu quả.

+3

Việc kiểm tra là chậm nhất, diễn viên là rất nhanh trên các loại tài liệu tham khảo, bởi vì nó chỉ trả về tham chiếu. –

+0

Câu trả lời này đã giúp tôi có được ý tưởng .. – nawfal

6

"là" về cơ bản tương đương với toán tử "isinst" IL - bài viết đó mô tả nhanh.

3

Cần đủ nhanh để không quan trọng. Nếu bạn đang kiểm tra kiểu của một đủ đối tượng cho nó để tạo ra một tác động đáng kể về hiệu suất mà bạn cần phải suy nghĩ lại thiết kế của bạn

7

Con đường tôi học được nó là điều này:

if (obj is Foo) { 
    Foo f = (Foo)obj; 
    f.doSomething(); 
} 

là chậm hơn so với điều này:

Foo f = obj as Foo; 
if (f != null) { 
    f.doSomething(); 
} 

Có đủ chậm không? Có lẽ không, nhưng đó là một điều đơn giản để chú ý, rằng bạn cũng có thể làm điều đó.

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