Tại sao phương thức Count () sử dụng từ khóa đã được kiểm tra trên đường truyền thống?


23

Khi tôi đang tìm sự khác biệt giữa Count và Count () , tôi nghĩ lướt qua mã nguồn của Count(). Tôi thấy đoạn mã sau đây trong đó tôi tự hỏi tại sao checkedtừ khóa là cần thiết / cần thiết:

int num = 0;
using (IEnumerator<TSource> enumerator = source.GetEnumerator())
{
    while (enumerator.MoveNext())
    {
        num = checked(num + 1);
    }
    return num;
}

Mã nguồn:

// System.Linq.Enumerable
using System.Collections;
using System.Collections.Generic;

public static int Count<TSource>(this IEnumerable<TSource> source)
{
    if (source == null)
    {
        ThrowHelper.ThrowArgumentNullException(ExceptionArgument.source);
    }
    ICollection<TSource> collection = source as ICollection<TSource>;
    if (collection != null)
    {
        return collection.Count;
    }
    IIListProvider<TSource> iIListProvider = source as IIListProvider<TSource>;
    if (iIListProvider != null)
    {
        return iIListProvider.GetCount(onlyIfCheap: false);
    }
    ICollection collection2 = source as ICollection;
    if (collection2 != null)
    {
        return collection2.Count;
    }
    int num = 0;
    using (IEnumerator<TSource> enumerator = source.GetEnumerator())
    {
        while (enumerator.MoveNext())
        {
            num = checked(num + 1);
        }
        return num;
    }
}

2
.NET 4.0 chưa có kiểm tra này, 4.5 đã làm. Làm cho nó phần nào có khả năng rằng điều này đã được thực hiện để tránh rắc rối với các trình lặp WinRT , lưu ý rằng chúng sử dụng uint.
Hans Passant

Câu trả lời:


35

Bởi vì nó không muốn trả về một số âm trong trường hợp (không thể thừa nhận) rằng có hơn 2 tỷ mục lẻ trong chuỗi - hoặc một số không âm nhưng chỉ là số sai trong trường hợp (thậm chí khó xảy ra hơn) có hơn 4 tỷ mục lẻ trong chuỗi. checkedsẽ phát hiện tình trạng tràn.


1
@ DavidMårtensson C # mặc định unchecked; Mặc dù nó có thể được lật sang checkedcấp toàn cầu thông qua một trình chuyển đổi trình biên dịch - nhưng thật lòng tôi hiếm khi thấy nó được sử dụng, vì vậy tôi nghĩ rằng rất sai khi cho rằng C # "thường" chạy trong checkedchế độ; cũng lưu ý rằng unsafekhông có tương tác vớiunchecked
Marc Gravell

1
Đó là tin tức với tôi, tôi đã thử nghiệm điều này trong một dự án trước khi viết và C # phàn nàn về việc tràn cho đến khi tôi thêm không được kiểm tra xung quanh nó? Chỉnh sửa: Tìm thấy câu trả lời cho những gì tôi thấy "Đối với các biểu thức không đổi (các biểu thức có thể được đánh giá đầy đủ tại thời gian biên dịch), bối cảnh mặc định luôn được kiểm tra. Trừ khi một biểu thức không đổi được đặt rõ ràng trong một ngữ cảnh không được kiểm tra, tràn ra xảy ra trong quá trình biên dịch đánh giá thời gian của biểu thức gây ra lỗi thời gian biên dịch. "
David Mårtensson

@ DavidMårtensson ah, vâng - sắc thái tốt; Tôi đã nói về thời gian chạy; như bạn nói: thời gian biên dịch là khác nhau
Marc Gravell

Nhưng thời gian biên dịch không áp dụng cho ví dụ của bài đăng nên nhận xét của tôi không chính xác và tôi đã xóa nó.
David Mårtensson
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.