गणना () पद्धति "चेक किए गए" कीवर्ड का उपयोग क्यों करती है?


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 का उपयोग करते हैं।
हंस पैसेंट

जवाबों:


35

क्योंकि यह (व्यक्तिगत रूप से असंभावित) घटना में एक नकारात्मक संख्या वापस नहीं करना चाहता है कि अनुक्रम में 2 बिलियन से अधिक विषम वस्तुएं हैं - या (इससे भी अधिक संभावना नहीं) मामले में एक गैर-नकारात्मक लेकिन सिर्फ गलत संख्या है अनुक्रम में 4 बिलियन से अधिक विषम आइटम हैं। checkedअतिप्रवाह की स्थिति का पता लगाएगा।


1
@ DavidMårtensson C # के लिए चूक unchecked; यह checkedएक संकलक स्विच के माध्यम से वैश्विक स्तर पर डिफ़ॉल्ट रूप से फ़्लिप किया जा सकता है , हालांकि - लेकिन स्पष्ट रूप से मैं शायद ही कभी इसका उपयोग करता हूं, इसलिए मुझे लगता है कि यह सुझाव देना बहुत गलत है कि C # "आमतौर पर" checkedमोड में चलता है; नोट भी है कि unsafeके साथ कोई बातचीत नहीं हैunchecked
मार्क Gravell

1
यह मेरे लिए खबर थी, मैंने इसे लिखने से पहले एक परियोजना में परीक्षण किया और C # को ओवरफ्लो के बारे में शिकायत की जब तक मैंने इसके चारों ओर अनियंत्रित नहीं जोड़ा? संपादित करें: मैंने जो देखा उसका उत्तर मिला "निरंतर अभिव्यक्तियों के लिए (संकलित समय पर पूरी तरह से मूल्यांकन किया जा सकने वाले भाव), डिफ़ॉल्ट संदर्भ को हमेशा जांचा जाता है। जब तक कि एक स्थिर अभिव्यक्ति स्पष्ट रूप से अनियंत्रित संदर्भ में रखी जाती है, संकलन के दौरान होने वाले ओवरफ्लो। अभिव्यक्ति का समय पर मूल्यांकन संकलन-समय त्रुटियों का कारण बनता है। "
डेविड मोर्टेंसन

@ DavidMårtensson आह, हाँ - अच्छी बारीकियाँ; मैं रनटाइम के बारे में बात कर रहा था; जैसा कि आप कहते हैं: संकलन समय अलग है
मार्क Gravell

लेकिन संकलन का समय पोस्ट के उदाहरण के लिए लागू नहीं होता है इसलिए मेरी टिप्पणी गलत थी और मैंने इसे हटा दिया है।
डेविड मोर्टेंसन 23
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.