ทำไมการนับ () วิธีการใช้คำหลัก "ตรวจสอบ"?


23

ขณะที่ผมกำลังมองความแตกต่างระหว่างจำนวนและนับกัน ()Count()ผมคิดว่าเหลือบรหัสที่มาของ ฉันเห็นข้อมูลโค้ดต่อไปนี้ซึ่งฉันสงสัยว่าทำไมcheckedคำหลักจึงมีความจำเป็น / จำเป็น:

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

รหัสแหล่งที่มา:

// 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 ยังไม่มีการตรวจสอบนี้ 4.5 ได้ ทำให้ค่อนข้างเป็นไปได้ว่าสิ่งนี้ถูกทำขึ้นเพื่อหลีกเลี่ยงปัญหากับตัววนซ้ำ WinRTโปรดทราบว่าพวกเขาใช้ uint
Hans Passant

คำตอบ:


35

เนื่องจากไม่ต้องการส่งคืนจำนวนติดลบในเหตุการณ์ (ไม่น่าเป็นที่ยอมรับ) ว่ามีรายการมากกว่า 2 พันล้านรายการเรียงตามลำดับ - หรือหมายเลขที่ไม่เป็นลบ แต่เป็นเพียงหมายเลขที่ไม่ถูกต้องในกรณี มีลำดับมากกว่า 4 พันล้านรายการในลำดับ checkedจะตรวจสอบสภาพล้น


1
@ DavidMårtensson C # ค่าเริ่มต้นเป็นunchecked; มันสามารถพลิกไปเป็นcheckedค่าเริ่มต้นในระดับโลกผ่านคอมไพเลอร์สวิทช์ แต่ - จริงๆแล้วฉันไม่ค่อยเห็นว่าใช้แล้วดังนั้นฉันคิดว่ามันผิดมากที่จะแนะนำว่า C # คือ "ปกติ" ทำงานในcheckedโหมด; โปรดทราบว่าunsafeไม่มีการโต้ตอบกับunchecked
Marc Gravell

1
นั่นคือข่าวให้ฉันฉันทดสอบในโครงการก่อนที่จะเขียนและ C # บ่นเกี่ยวกับล้นจนฉันไม่ได้ตรวจสอบเพิ่มรอบ? แก้ไข: พบคำตอบสำหรับสิ่งที่ฉันเห็น "สำหรับนิพจน์คงที่ (นิพจน์ที่สามารถประเมินได้อย่างสมบูรณ์ในเวลาคอมไพล์) บริบทเริ่มต้นจะถูกตรวจสอบเสมอหากไม่มีการวางนิพจน์คงที่ในบริบทที่ไม่ได้ตรวจสอบ การประเมินเวลาของนิพจน์ทำให้เกิดข้อผิดพลาดในการคอมไพล์เวลา "
David Mårtensson

@ DavidMårtenssonอาใช่ - ความแตกต่างที่ดี ฉันกำลังพูดถึงรันไทม์; อย่างที่คุณพูด: เวลารวบรวมนั้นแตกต่าง
Marc Gravell

แต่เวลารวบรวมใช้ไม่ได้กับตัวอย่างของโพสต์ดังนั้นความคิดเห็นของฉันไม่ถูกต้องและฉันได้ลบมันแล้ว
David Mårtensson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.