.NET ডেটা স্ট্রাকচার:
অ্যারেলিস্ট এবং তালিকাগুলি আসলে আলাদা কেন সে সম্পর্কে কথোপকথনের আরও
অ্যারেগুলির
যেমন একজন ব্যবহারকারী বলেছেন, অ্যারেগুলি হ'ল "পুরাতন স্কুল" সংগ্রহ (হ্যাঁ, অ্যারে অংশ না হলেও একটি সংগ্রহ হিসাবে বিবেচিত হয় System.Collections
)। তবে, অন্যান্য সংগ্রহগুলির তুলনায় অ্যারে সম্পর্কে "পুরাতন স্কুল" কী, যেমন আপনি আপনার শিরোনামে তালিকাভুক্ত করেছেন (এখানে, অ্যারেলিস্ট এবং তালিকার তালিকা (টি))? অ্যারে দেখে বেসিকগুলি দিয়ে শুরু করা যাক।
শুরু করার জন্য, মাইক্রোসফ্ট .NET এ অ্যারেগুলি হ'ল , "এমন একটি প্রক্রিয়া যা আপনাকে বেশ কয়েকটি [যৌক্তিকভাবে সম্পর্কিত] আইটেমগুলিকে একক সংগ্রহ হিসাবে বিবেচনা করতে দেয়," (লিঙ্কিত নিবন্ধটি দেখুন)) ওটার মানে কি? অ্যারে পৃথক সদস্যদের (উপাদানগুলি) ক্রমানুসারে সংরক্ষণ করে, একের পর এক স্মৃতিতে একটি সূচনা ঠিকানা দিয়ে। অ্যারে ব্যবহার করে, আমরা সহজেই সেই ঠিকানায় শুরু করে ক্রমানুসারে সঞ্চিত উপাদানগুলি অ্যাক্সেস করতে পারি।
এর বাইরে এবং 101 টি সাধারণ ধারণার প্রোগ্রামিংয়ের বিপরীতে অ্যারেগুলি সত্যিই বেশ জটিল হতে পারে:
অ্যারেগুলি একক মাত্রা, বহুমাত্রিক বা জ্যাডেড হতে পারে (জেগড অ্যারেগুলি পড়ার পক্ষে মূল্যবান)। অ্যারেগুলি নিজেরাই গতিশীল নয়: একবার শুরু হয়ে গেলে এন আকারের একটি অ্যারে এন সংখ্যা সংখ্যক ধারণ করতে পর্যাপ্ত স্থান সংরক্ষণ করে। অ্যারের উপাদানগুলির সংখ্যা বাড়তে বা সঙ্কুচিত করতে পারে না। Dim _array As Int32() = New Int32(100)
অ্যারেতে 100 ইন্ট 32 প্রিমিটিভ টাইপ অবজেক্টস থাকতে মেমরি ব্লকে পর্যাপ্ত স্থান সংরক্ষণ করে (এই ক্ষেত্রে, অ্যারে 0s ধারণ করে আরম্ভ করা হয়)। এই ব্লকের ঠিকানা ফিরে এসেছে _array
।
নিবন্ধ অনুসারে, কমন ল্যাঙ্গুয়েজ স্পেসিফিকেশন (সিএলএস) এর জন্য সমস্ত অ্যারে শূন্য-ভিত্তিক হওয়া দরকার। .NET এ অ্যারেগুলি শূন্য-ভিত্তিক অ্যারে সমর্থন করে; তবে, এটি কম সাধারণ। শূন্য-ভিত্তিক অ্যারেগুলির "কমন-নেস" এর ফলস্বরূপ, মাইক্রোসফ্ট তাদের কার্যকারিতাটি অনুকূল করে তুলতে অনেক সময় ব্যয় করেছে ; অতএব, একক মাত্রা, শূন্য-ভিত্তিক (এসজেড) অ্যারেগুলি "বিশেষ" - এবং সত্যিকার অর্থে একটি অ্যারের সর্বোত্তম বাস্তবায়ন (বহুমাত্রিক ইত্যাদির বিপরীতে) - কারণ এসজেডগুলিতে হেরফেরের জন্য নির্দিষ্ট মধ্যস্থতাকারী ভাষা নির্দেশ রয়েছে।
অ্যারে সর্বদা রেফারেন্স দ্বারা পাস করা হয় (একটি মেমরি ঠিকানা হিসাবে) - অ্যারে ধাঁধার একটি গুরুত্বপূর্ণ টুকরা জানতে। যখন তারা সীমানা যাচাই করে (ত্রুটি ছুঁড়ে দেবে), সীমা পরীক্ষা করা অ্যারেতেও অক্ষম করা যায়।
আবার অ্যারেগুলিতে সবচেয়ে বড় বাধা হ'ল তারা পুনরায় আকার ধারণ করতে পারে না। তাদের একটি "স্থির" ক্ষমতা রয়েছে। আমাদের ইতিহাসে অ্যারেলিস্ট এবং তালিকা (টি অফ) উপস্থাপন করা হচ্ছে:
অ্যারেলিস্ট - নন-জেনেরিক তালিকা
ArrayList (বরাবর সঙ্গে List(Of T)
- যদিও কিছু সমালোচনামূলক পার্থক্য আছে, এখানে, পরে ব্যাখ্যা) - সম্ভবত সংগ্রহের পাশে উপরন্তু (বিস্তৃত অর্থে) হিসেবে শ্রেষ্ঠ চিন্তা। ArrayList থেকে উত্তরাধিকারী IList ইন্টারফেস ( 'ICollection' বংশধর)। অ্যারেলিস্টগুলি নিজেরাই বাল্কিয়ার - তালিকার চেয়ে ওভারহেডের বেশি প্রয়োজন ।
IList
অ্যারেলিস্টগুলি স্থির আকারের তালিকা হিসাবে বিবেচনা করতে সক্ষম করে (অ্যারেগুলির মতো); তবে অ্যারেলিস্টগুলির দ্বারা যুক্ত অতিরিক্ত কার্যকারিতা অতিক্রম করে এই ক্ষেত্রে অ্যারেলিস্ট (অ্যারেগুলির ওপরে) হিসাবে স্থির আকারের অ্যারেলিস্টগুলি ব্যবহার করার কোনও আসল সুবিধা নেই যা খুব ধীরে ধীরে ধীর।
আমার পড়া থেকে, অ্যারেলিস্টগুলি ঝাঁকুনি দেওয়া যায় না: "উপাদান হিসাবে বহুমাত্রিক অ্যারে ব্যবহার করা ... সমর্থিত নয়"। আবার অ্যারেলিস্টের কফিনে আর একটি পেরেক। ArrayLists এছাড়াও নয় "টাইপ" হয় - যার অর্থ, নীচে সবকিছু, একটি ArrayList কেবল বস্তুর একটি গতিশীল এরে হল: Object[]
। এটির অ্যারেলিস্টগুলি প্রয়োগ করার সময় আবার প্রচুর বক্সিং (অন্তর্নিহিত) এবং আনবক্সিং (স্পষ্ট) প্রয়োজন এবং তাদের ওভারহেড যুক্ত করুন।
অসমর্থিত চিন্তাভাবনা: আমার মনে হয় যে আমার একজন অধ্যাপকের কাছ থেকে পড়া বা শুনে শুনেছি যে অ্যারেলিস্টগুলি অ্যারে থেকে তালিকা-ধরণের সংগ্রহগুলিতে যাওয়ার প্রচেষ্টাের জারজ ধারণার বাচ্চা, যেমন একবার অ্যারেতে দুর্দান্ত উন্নতি হয়েছিল, সংগ্রহের ক্ষেত্রে আরও বিকাশ করা হওয়ায় এগুলি এখন আর সেরা বিকল্প নয়
তালিকা (টি এর): অ্যারেলিস্ট কী হয়ে গেছে (এবং আশা করা যায়)
মেমরির ব্যবহারের পার্থক্যটি যথেষ্ট তাৎপর্যপূর্ণ যেখানে একটি তালিকা (অফ32 এর) একই আদিম ধরণের অ্যারেলিস্টের তুলনায় 56% কম মেমরি গ্রাস করেছে (উপরের ভদ্রলোকের সংযুক্ত প্রদর্শনে 8 এমবি বনাম 19 এমবি: আবার, এখানে লিঙ্কযুক্ত ) - যদিও এটি 64-বিট মেশিন দ্বারা মিশ্রিত ফলাফল। এই পার্থক্যটি সত্যই দুটি জিনিস প্রদর্শন করে: প্রথম (1), একটি বক্সযুক্ত ইন্টার 32-প্রকারের "অবজেক্ট" (অ্যারেলিস্ট) খাঁটি ইন্টার 32 প্রিমিটিভ টাইপের (তালিকা) এর চেয়ে অনেক বড়; দ্বিতীয় (২), একটি 64৪-বিট মেশিনের অভ্যন্তরীণ কাজের ফলে পার্থক্যটি প্রকাশযোগ্য।
সুতরাং, পার্থক্য কী এবং একটি তালিকা (টি) কী? এমএসডিএন একটি List(Of T)
হিসাবে সংজ্ঞা দেয় , "... সূচক দ্বারা অ্যাক্সেস করা যায় এমন বস্তুর একটি দৃ objects়ভাবে টাইপ করা তালিকা" " এখানে গুরুত্বটি হ'ল "দৃ strongly়ভাবে টাইপ করা" বিট: একটি তালিকা (অফ টি) 'ধরণের স্বীকৃতি দেয়' এবং বস্তুগুলিকে তাদের ধরণের হিসাবে সংরক্ষণ করে। সুতরাং, একটি একটি Int32
হিসাবে সংরক্ষণ করা হয় Int32
এবং একটি Object
টাইপ নয়। এটি বক্সিং এবং আনবক্সিংয়ের কারণে সৃষ্ট সমস্যাগুলি সরিয়ে দেয়।
এমএসডিএন উল্লেখ করে যে এই পার্থক্যটি কেবলমাত্র প্রারম্ভিক প্রকারগুলি সংরক্ষণ করে যখন রেফারেন্সের ধরণগুলি সংরক্ষণ করে না play এছাড়াও, পার্থক্যটি সত্যই বড় আকারে ঘটে: 500 টিরও বেশি উপাদান। আরও মজার বিষয় হ'ল এমএসডিএন ডকুমেন্টেশনটি পড়েছে, "অ্যারেলিস্ট ক্লাসটি ব্যবহার না করে তালিকার (টি) শ্রেণির প্রকার-নির্দিষ্ট প্রয়োগ প্রয়োগ করা আপনার সুবিধার জন্য ...."
মূলত, তালিকা (অফ টি) অ্যারেলিস্ট, তবে আরও ভাল। এটি অ্যারেলিস্টের "জেনেরিক সমতুল্য"। অ্যারেলিস্টের মতো, এটি বাছাই করা গ্যারান্টিযুক্ত হয় না বাছাই করা পর্যন্ত (চিত্র দেখুন) তালিকার (টি অফ) টিতে কিছু যুক্ত কার্যকারিতা রয়েছে।