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à 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
.
Nguồn
2011-11-05 23:00:13
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 –
@ 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ỏ. –
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