কেন গণনা () পদ্ধতিটি "পরীক্ষিত" কীওয়ার্ডটি ব্যবহার করে?


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 পুনরুক্তিকারীদের সমস্যা এড়াতে এটি করা হয়েছিল , নোট করুন যে তারা মদ ব্যবহার করে।
হান্স প্যাস্যান্ট

উত্তর:


35

কারণ এটি (স্বীকারযোগ্যভাবে অসম্ভব) ইভেন্টে নেতিবাচক সংখ্যাটি ফিরিয়ে আনতে চায় না যে ক্রমটিতে 2-বিলিয়ন-এরও বেশি আইটেম রয়েছে - বা (আরও সম্ভাবনা নেই) ক্ষেত্রে একটি অ-নেতিবাচক তবে কেবল ভুল নম্বর রয়েছে সিকোয়েন্সে 4 বিলিয়ন-এরও বেশি আইটেম রয়েছে। checkedওভারফ্লো পরিস্থিতি সনাক্ত করবে।


1
@ ডেভিডমার্টেনসন সি # এ ডিফল্ট unchecked; এটি checkedএকটি সংকলক সুইচের মাধ্যমে বৈশ্বিক স্তরে ডিফল্টরূপে উল্টানো যেতে পারে , তবে - তবে সত্যই আমি খুব কমই দেখতে পাই যে এটি ব্যবহৃত হয়েছে, সুতরাং আমি মনে করি যে সি # "সাধারণত" checkedমোডে চালিত হয় ; এছাড়াও লক্ষ করুন যে এর unsafeসাথে কোনও মিথস্ক্রিয়া নেইunchecked
মার্ক গ্রাভেল

1
এটি আমার কাছে খবর ছিল, আমি এটি লেখার আগে একটি প্রকল্পে এটি পরীক্ষা করেছিলাম এবং সি # যতক্ষণ না আমি তার চারপাশে যাচাই না করা পর্যন্ত ওভারফ্লো সম্পর্কে অভিযোগ করেছিলাম? সম্পাদনা: আমি যা দেখেছি তার উত্তর খুঁজে পেয়েছি "ধ্রুবক অভিব্যক্তির জন্য (সংকলনের সময় সম্পূর্ণরূপে মূল্যায়ন করা যায় এমন এক্সপ্রেশন), ডিফল্ট প্রসঙ্গটি সর্বদা পরীক্ষা করা হয় Un যদি একটি ধ্রুবক অভিব্যক্তি স্পষ্টভাবে একটি চেক না করা প্রেক্ষাপটে স্থাপন না করা হয়, সংকলনের সময় ঘটে যাওয়া ওভারফ্লোগুলি -প্রকাশকালীন মূল্যায়ন সংকলন-সময় ত্রুটির কারণ। "
ডেভিড মর্টেনসন

@ ডেভিডমার্টেনসন আহ, হ্যাঁ - শুভ উপদ্রব; আমি রানটাইমের কথা বলছিলাম; যেমন আপনি বলেছেন: সংকলন-সময়টি আলাদা
মার্ক গ্রাভেল

তবে সংকলনের সময়টি পোস্টের উদাহরণের জন্য প্রযোজ্য না তাই আমার মন্তব্যটি ভুল ছিল এবং আমি এটি মুছে ফেলেছি।
ডেভিড মর্টেনসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.