Mục đích của * 200L/100L
không rõ ràng hơn * 2
theo ý kiến của tôi. Lý do duy nhất tôi có thể nghĩ tại sao nó được thực hiện như thế là để đảm bảo chiều dài hàng đợi có thể tăng lên đến 200 lần. Có sự khác biệt trong * 200/100
và * 2
sao cho kết quả đầu tiên sẽ dẫn đến ngoại lệ tràn cho số nhỏ hơn 100 lần. Ví dụ, nếu đó là cho các giá trị byte, x * 200/100
sẽ thất bại cho x == 2 nhưng * 2
sẽ thất bại chỉ khi x là lớn như 128.
Nhưng khi Marcelo Cantos chỉ ra (long)this._array.Length * 200L/100L
sẽ không bao giờ tràn nên câu trả lời của tôi là có lẽ không giúp đỡ nhiều.
Nó có thể là 'tính năng' của ILSpy không? Có lẽ trong mã nguồn nó chỉ là * 2
.
EDIT
Sau khi điều tra bổ sung có vẻ rằng mã lạ này phải là một artefact của một số refactoring. Tôi đã kiểm tra cách nó được thực hiện trong Danh sách <>
private void EnsureCapacity(int min)
{
if (this._items.Length < min)
{
int num = (this._items.Length == 0) ? 4 : (this._items.Length * 2);
if (num < min)
{
num = min;
}
this.Capacity = num;
}
}
Điều này cũng đơn giản như bạn mong đợi. Tôi đoán là mã Queue.Enqueue
đã được làm lại nhưng không được dọn dẹp hoàn toàn và một số mã lạ xuất phát từ thay đổi này.Hầu hết các nhà phát triển giả định rằng các thư viện của Microsoft là hoàn hảo và mọi thứ đều có ý nghĩa nhưng có khả năng là không phải mọi dòng mã đều được viết bởi một thiên tài :-)
Nguồn
2012-03-23 11:43:02
num được sử dụng để làm gì? – UrbanEsc
@UrbanEsc Nó được sử dụng để thay đổi kích thước mảng –
Nó không thể liên quan đến tràn, vì '(dài) _array.Length * 200' sẽ không bao giờ tràn. Công cụ '+ 4' là đảm bảo rằng mảng vẫn phát triển ngay cả khi kích thước ban đầu của nó bằng 0. –