2011-11-05 40 views
15

1) Tôi đọc một số đoạn mã (chung) và thấy một số địa điểm sử dụng IList<T> và một số được sử dụng IEnumerable. Những thuận lợi để sử dụng đầu tiên trên thứ hai là gì?Tại sao nên sử dụng IList trên IEnumerable?

2) isas bằng C#. Tôi hiểu is thực hiện kiểm tra loại và as hiện đang truyền. Nhưng chính xác là gì? buộc dữ liệu đến một số đối tượng có kích thước? khi isas khác nhau?

Trả lời

29

Một IList[<T>] đại diện cho một cái gì đó:

  • có thể được lặp
  • là hữu hạn, kích thước được biết đến
  • là lặp lại
  • thể được truy cập một cách ngẫu nhiên bởi chỉ số
  • có thể (tùy chọn , có thể kiểm tra) được chỉnh sửa: gán lại các giá trị, thêm, xóa, v.v.

An IEnumerable, mặt khác, chỉ có thể được lặp lại. Không phải tất cả những thứ có thể được lặp lại đều là danh sách. Ví dụ:

static IEnumerable<int> Get() { 
    Random rand = new Random(); 
    while(true) yield return rand.Next(); 
} 

rằng ^^^ là chuỗi vô hạn. Nó không có chiều dài, không thể được biến đổi, không thể được truy cập bởi chỉ số ... Tuy nhiên, nó có thể được lặp:

foreach(int i in Get().Take(200)) { 
    Console.WriteLine(i); 
} 

is thực hiện một kiểm tra kiểu trả về true/false ... tức là obj an IList? có hay không.

as thực hiện kiểm tra "thử làm điều này"; nó trả về null nếu nó không thành công hoặc tham chiếu đã nhập (v.v) nếu thành công. Về cơ bản, nó là một điều hiệu quả:

if(obj is IList) { 
    var list = (IList) obj; 
    ... 
} 

là kém hiệu quả hơn:

var list = obj as IList; 
if(list != null) { 
    ... 
} 

họ cũng hành xử khác nhau nếu obj là null; is ném ngoại lệ; as trả về null.

+1

Bạn đã thực sự đo lường hiệu suất của hai? Lệnh IL isinst mặc dù tên của nó cho thấy rằng nó tương ứng với thực sự là tương ứng với hoạt động. Không có hoạt động nào trong IL. Thực tế là trong IL là 'obj as type! = Null' http://blogs.msdn.com/b/ericlippert/archive/2010/09/16/is-is-as-or-is-as-is. aspx. Vì vậy, sự lựa chọn nên được về khả năng đọc tôi muốn nói –

+1

@ RuneFS Tôi thường xuyên mã trong IL, vì vậy tôi rất ý thức về điều đó. Sự khác biệt, tuy nhiên, là castclass thêm ** sau ** isinst. Đó là, tôi thừa nhận, một sự khác biệt nhỏ. –

+0

Tôi nghĩ rằng trình biên dịch JIT sẽ có thể tối ưu hóa ra lớp đó. Nhưng tôi không biết nếu nó hiện đang làm. – CodesInChaos

3
  1. IList cung cấp các phương thức nhất định mà IEnumerable thì không. Quan trọng nhất, khả năng thêm vào nó (để biết thêm thông tin, hãy xem msdn)
  2. is so sánh các loại, trả lại nếu một đối tượng nhất định có thể được đúc thành một loại. as thực sự thực hiện dàn diễn viên đó, trả lại null nếu không thành công. Đúc có nghĩa là chuyển đổi một đối tượng thuộc loại A thành một đối tượng thuộc loại B, vì bất kỳ lý do gì.
+1

Phần lớn thời gian, trong C#, quá trình truyền không chuyển đổi đối tượng giữa các loại. Thông thường, nó chỉ kiểm tra xem một đối tượng có thuộc kiểu thời gian biên dịch đã cho hay không, và nếu như vậy cho phép bạn gán đối tượng đó vào một biến kiểu đã nói. (Nếu không, trả về 'null' hoặc ném một ngoại lệ, tùy thuộc vào nếu bạn sử dụng parens hoặc' as'.) – millimoose

+0

Thực tế, nó thường đề cập đến cưỡng chế, không chuyển đổi –

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