সি # তে ArrayList
এবং পার্থক্য কী List<>
?
এটি কি কেবল List<>
টাইপ ArrayList
করে না যখন থাকে না?
List<>
সাধারণভাবে সম্পর্কে জিজ্ঞাসা করে , যখন যে কেউ List<object>
বিশেষভাবে জিজ্ঞাসা করে
সি # তে ArrayList
এবং পার্থক্য কী List<>
?
এটি কি কেবল List<>
টাইপ ArrayList
করে না যখন থাকে না?
List<>
সাধারণভাবে সম্পর্কে জিজ্ঞাসা করে , যখন যে কেউ List<object>
বিশেষভাবে জিজ্ঞাসা করে
উত্তর:
হ্যাঁ, বেশ। List<T>
একটি জেনেরিক ক্লাস। এটি কোনও নির্দিষ্ট ধরণের মান to object
ালাই বা না withoutালাই সংরক্ষণ করে (যা ক্ষেত্রে T
মূল্যমানের ধরণের ArrayList
ক্ষেত্রে বক্সিং / আনবক্সিং ওভারহেডে পড়তে পারে) সমর্থন করে। ArrayList
কেবল object
রেফারেন্স সঞ্চয় করে । জেনেরিক সংগ্রহ হিসাবে, List<T>
জেনেরিক IEnumerable<T>
ইন্টারফেস প্রয়োগ করে এবং লিনকুইতে সহজেই ব্যবহার করা যেতে পারে (কোনও Cast
বা OfType
কল প্রয়োজন ছাড়াই )।
ArrayList
সি # এর জেনেরিকস নেই এমন দিনগুলির সাথে সম্পর্কিত। এটি পক্ষে হ্রাস করা হয়েছে List<T>
। ArrayList
NET> = 2.0 কে টার্গেট করে এমন নতুন কোডে আপনার ব্যবহার করা উচিত নয় যদি না আপনি এটি ব্যবহার করে এমন কোনও পুরানো API এর সাথে ইন্টারফেস না করে।
ArrayList
রানটাইমের সময় কার্যকরভাবে একই । স্ট্যাটিক্যালি যদিও, এটির সাথে একটি কাস্ট লাগবে ArrayList
।
List<T>
আপনি ব্যবহার করে ingালাই ত্রুটি প্রতিরোধ করতে পারে। রানটাইম cast ালাইয়ের ত্রুটি এড়াতে এটি খুব দরকারী ।
উদাহরণ:
এখানে (ব্যবহার করে ArrayList
) আপনি এই কোডটি সংকলন করতে পারেন তবে পরে আপনি কার্যকর করার ত্রুটি দেখতে পাবেন।
ArrayList array1 = new ArrayList();
array1.Add(1);
array1.Add("Pony"); //No error at compile process
int total = 0;
foreach (int num in array1)
{
total += num; //-->Runtime Error
}
আপনি যদি ব্যবহার করেন তবে আপনি List
এই ত্রুটিগুলি এড়িয়ে চলুন:
List<int> list1 = new List<int>();
list1.Add(1);
//list1.Add("Pony"); //<-- Error at compile process
int total = 0;
foreach (int num in list1 )
{
total += num;
}
তথ্যসূত্র: এমএসডিএন
উপরোক্ত বিষয়গুলিতে যুক্ত করতে। ব্যবহার ArrayList
64bit অপারেটিং সিস্টেমের মধ্যে 32bit অপারেটিং সিস্টেম ব্যবহার তুলনায় 2x মেমরির লাগে। এদিকে, জেনেরিক তালিকাটি এর List<T>
চেয়ে অনেক কম মেমোরি ব্যবহার করবে ArrayList
।
উদাহরণস্বরূপ, যদি আমরা ArrayList
32-বিটের মধ্যে 19MB ব্যবহার করি তবে এটি 64-বিটে 39MB লাগবে। তবে যদি আপনার কাছে List<int>
32-বিটের 8 এমবি এর জেনেরিক তালিকা থাকে তবে এটি কেবলমাত্র 8.1 এমবি লাগবে -৪-বিটে, যা অ্যারেলিস্টের সাথে তুলনা করার সময় একটি তীব্র 481% পার্থক্য।
উত্স: অ্যারেলিস্টের বনাম আদিম ধরণের এবং 64৪-বিটের জন্য জেনেরিক তালিকা
যুক্ত করার জন্য আরেকটি পার্থক্য হ'ল থ্রেড সিঙ্ক্রোনাইজেশন সম্পর্কিত।
ArrayList
সিঙ্ক্রোনাইজড প্রোপার্টিটির মাধ্যমে কিছু থ্রেড-সুরক্ষা সরবরাহ করে যা সংগ্রহের চারপাশে থ্রেড-নিরাপদ মোড়কে দেয় returns মোড়ক প্রতিটি সংযোজন বা অপসারণ অপারেশনটিতে পুরো সংগ্রহটি লক করে কাজ করে। সুতরাং, সংগ্রহে অ্যাক্সেস করার চেষ্টা করা প্রতিটি থ্রেডের একটি লক নেওয়ার জন্য তার পালা অপেক্ষা করতে হবে। এটি পরিমাপযোগ্য নয় এবং এটি বড় সংগ্রহের জন্য উল্লেখযোগ্য পারফরম্যান্সের অবক্ষয়ের কারণ হতে পারে।
List<T>
কোনও থ্রেড সিঙ্ক্রোনাইজেশন সরবরাহ করে না; আইটেমগুলি একযোগে একাধিক থ্রেডে যুক্ত করা বা অপসারণ করার সময় ব্যবহারকারী কোডকে সমস্ত সিঙ্ক্রোনাইজেশন সরবরাহ করতে হবে।
এখানে আরও তথ্য । নেট ফ্রেমওয়ার্কে থ্রেড সিঙ্ক্রোনাইজেশন
ArrayList
যদি এটি এড়ানো যায় তবে আপনার ব্যবহার করা উচিত, তবে এটি একটি নির্বোধ কারণ। মোড়ক পুরোপুরি পুরোপুরি alচ্ছিক; আপনার যদি লকিংয়ের প্রয়োজন না হয় বা আপনার আরও দানাদার নিয়ন্ত্রণের প্রয়োজন হয় তবে মোড়কটি ব্যবহার করবেন না।
সহজ উত্তরটি হ'ল,
ArrayList arrayList = new ArrayList();
List<int> list = new List<int>();
arrayList.Add(1);
arrayList.Add("String");
arrayList.Add(new object());
list.Add(1);
list.Add("String"); // Compile-time Error
list.Add(new object()); // Compile-time Error
মাইক্রোসফ্ট অফিসিয়াল ডকুমেন্টটি পড়ুন : https : //blogs.msdn.mic Microsoft.com/kcwalina/2005/09/23/system-colલેક્--vs-system-colલેક્- জেনেরিক- এবং- সিস্টেমে-colifications- objectmodel/
দ্রষ্টব্য : পার্থক্যটি বোঝার আগে আপনার জেনেরিক্সগুলি জানা উচিত: https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/generics/
ArrayList
এটি হ'ল বিভিন্ন ধরণের ডেটা List<>
সংগ্রহ যেখানে একই ধরণের নিজস্ব নিজস্ব অবক্ষয়ের সংগ্রহ is
ArrayList
টাইপ নিরাপদ যেখানে টাইপ নিরাপদ হয় না List<T>
। সরল :)।
পারফরম্যান্স ইতিমধ্যে একটি পৃথক কারণ হিসাবে বিভিন্ন উত্তরে উল্লেখ করা হয়েছে, কিন্তু " কত ধীর গতি ArrayList
? "এবং" কেন এটি সামগ্রিকভাবে ধীর? ”, নীচে দেখুন।
যখনই মানের ধরণের উপাদান হিসাবে ব্যবহৃত হয়, তখন পারফরম্যান্স নাটকীয়ভাবে হ্রাস পায় ArrayList
। কেবল উপাদান যুক্ত করার ক্ষেত্রে বিবেচনা করুন। বক্সিং চলার কারণে - যেহেতু ArrayList
কেবল যোগগুলি object
প্যারামিটার নেয় - আবর্জনা সংগ্রাহক এর চেয়ে অনেক বেশি কাজ সম্পাদনে তত্পর হয় List<T>
।
সময়ের পার্থক্য কত? কমপক্ষে কয়েকগুণ কম ধীর List<T>
। শুধু কি কোড একটি 10 মিল int- এ মান যোগ সঙ্গে ঘটে কটাক্ষপাত করা ArrayList
বনাম List<T>
:
এটি হলুদে হাইলাইট করা 'মিন' কলামে 5x এর একটি রান টাইম পার্থক্য । প্রতিটি বর্ণের জন্য আবর্জনা সংগ্রহের সংখ্যার পার্থক্যটিও লক্ষ করুন, লাল রঙে হাইলাইট করা হয়েছে (জিসি / 1000 রানের সংখ্যা নেই)।
দ্রুত যা চলছে তা দেখার জন্য একজন প্রোফাইলার ব্যবহার করে দেখা যায় যে প্রকৃত উপাদান যুক্ত করার বিপরীতে বেশিরভাগ সময় জিসি করাতে ব্যয় করা হয় । নীচে বাদামী বারগুলি আবর্জনা সংগ্রাহকের ক্রিয়াকলাপটিকে অবরুদ্ধ করে:
আমি উপরের ArrayList
দৃশ্যের সাথে কী ঘটে যায় তার একটি বিশদ বিশ্লেষণ লিখেছি https://mihai-albert.com/2019/12/15/boxing-performance-in-c-analysis-and-benchmark/ ।
অনুরূপ অনুসন্ধানগুলি জেফ্রি রিখর দ্বারা "সিএলআর মাধ্যমে সি #" তে রয়েছে। অধ্যায় 12 (জেনারিক্স) থেকে:
[…] যখন আমি আমার কম্পিউটারে এই প্রোগ্রামটির একটি রিলিজ বিল্ড (অপ্টিমাইজেশন চালু করা হয়) সংকলন করি এবং চালিত করি তখন আমি নিম্নলিখিত আউটপুটটি পাই।
00: 00: 01.6246959 (GCs = 6) তালিকা <আইটি 32>
00: 00: 10.8555008 (জিসি = 390) এরেন্টি তালিকা
00: 00: 02.5427847 (সিসি = 4) তালিকা <স্ট্রিং>
00: 00: 02.794444831 (জিসিএস = 7 ) অ্যারেলিস্ট অফ স্ট্রিংএখানে আউটপুট দেখায় যে Int32 টাইপের সাথে জেনেরিক তালিকার অ্যালগরিদম ব্যবহার করা আন্তঃ 32 এর সাথে জেনেরিক অ্যারেলিস্ট অ্যালগরিদম ব্যবহারের চেয়ে অনেক দ্রুত। আসলে, পার্থক্যটি অসাধারণ: প্রায় 11 সেকেন্ডের তুলনায় 1.6 সেকেন্ড। এটি times 7 গুণ দ্রুত ! এছাড়াও, অ্যারেলিস্ট সহ একটি মান ধরণের (ইন্ট 32) ব্যবহার করার ফলে প্রচুর বক্সিং অপারেশন ঘটে যার ফলস্বরূপ 390 আবর্জনা সংগ্রহের ফলাফল। এদিকে তালিকার অ্যালগরিদমে 6 টি আবর্জনা সংগ্রহের প্রয়োজন।
আমি মনে করি, মধ্যে পার্থক্য ArrayList
এবং List<T>
আছেন:
List<T>
, যেখানে টি মান-প্রকারের চেয়ে দ্রুত ArrayList
। এটি কারণ List<T>
বক্সিং / আনবক্সিং এড়ানো (যেখানে টি মান ধরণের)।ArrayList
পিছিয়ে সামঞ্জস্যের জন্য ব্যবহৃত হয়। (বাস্তব পার্থক্য নয়, তবে আমি মনে করি এটি গুরুত্বপূর্ণ নোট)।ArrayList
তখন প্রতিফলন আরও সহজList<T>
ArrayList
হয়েছে IsSynchronized
সম্পত্তি। সুতরাং, সিঙ্ক্রোনাইজড তৈরি এবং ব্যবহার করা সহজ ArrayList
। আমি এর IsSynchronized
জন্য সম্পত্তি পাইনি List<T>
। এছাড়াও মনে রাখবেন এই ধরণের সিঙ্ক্রোনাইজেশন তুলনামূলকভাবে অদক্ষ, এমএসডিএন ):
var arraylist = new ArrayList();
var arrayListSyncronized = ArrayList.Synchronized(arraylist
Console.WriteLine($"syncronized {arraylist.IsSynchronized}");
Console.WriteLine($"syncronized {arrayListSyncronized.IsSynchronized}");
var list = new List<object>();
var listSyncronized = ArrayList.Synchronized(list);
Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
Console.WriteLine($"syncronized {list.IsSynchronized}");//error, no such prop
ArrayList
সিঙ্ক্রোনাইজেশনArrayList.SyncRoot
( এমএসডিএন ) এর জন্য ব্যবহারযোগ্য সম্পত্তি রয়েছে property List<T>
না আছে SyncRoot
সম্পত্তি, তাই নিম্নলিখিত নির্মাণে আপনি কিছু অবজেক্ট ব্যবহার করে আপনি ব্যবহার দরকার List<T>
:
ArrayList myCollection = new ArrayList();
lock(myCollection.SyncRoot) // ofcourse you can use another object for this goal
{
foreach (object item in myCollection)
{
// ...
}
}
.NET ফ্রেমওয়ার্ক ডকুমেন্টেশনে উল্লিখিত হিসাবে
আমরা আপনাকে
ArrayList
নতুন বিকাশের জন্য ক্লাসটি ব্যবহার করার পরামর্শ দিচ্ছি না । পরিবর্তে, আমরা আপনাকে জেনেরিকList<T>
ক্লাস ব্যবহার করার পরামর্শ দিই ।ArrayList
বর্গ অবজেক্টের ভিন্নধর্মী সংগ্রহের রাখা ডিজাইন করা হয়েছে। তবে এটি সর্বদা সেরা পারফরম্যান্স দেয় না। পরিবর্তে, আমরা নিম্নলিখিতটি সুপারিশ করি:
- বস্তুর বিজাতীয় সংগ্রহের জন্য,
List<Object>
(সি # তে) বাList(Of Object)
(ভিজ্যুয়াল বেসিক) প্রকারটি ব্যবহার করুন।- সামগ্রীর একজাতীয় সংগ্রহের জন্য,
List<T>
শ্রেণিটি ব্যবহার করুন ।
আরও দেখুন জেনারিক সংগ্রহগুলি ব্যবহার করা উচিত নয়
"তালিকা" ব্যবহার করে আপনি কাস্টিং ত্রুটিগুলি প্রতিরোধ করতে পারেন। রানটাইম castালাইয়ের ত্রুটি এড়াতে এটি খুব দরকারী।
উদাহরণ:
এখানে (অ্যারেলিস্ট ব্যবহার করে) আপনি এই কোডটি সংকলন করতে পারেন তবে পরে আপনি কার্যকর করার ত্রুটি দেখতে পাবেন।
// Create a new ArrayList
System.Collections.ArrayList mixedList = new System.Collections.ArrayList();
// Add some numbers to the list
mixedList.Add(7);
mixedList.Add(21);
// Add some strings to the list
mixedList.Add("Hello");
mixedList.Add("This is going to be a problem");
System.Collections.ArrayList intList = new System.Collections.ArrayList();
System.Collections.ArrayList strList = new System.Collections.ArrayList();
foreach (object obj in mixedList)
{
if (obj.GetType().Equals(typeof(int)))
{
intList.Add(obj);
}
else if (obj.GetType().Equals(typeof(string)))
{
strList.Add(obj);
}
else
{
// error.
}
}
আমার কাছে এটি আপনার ডেটা জানা সম্পর্কে। যদি আমি দক্ষতার ভিত্তিতে আমার কোডটি প্রসারিত করে চলেছি তবে আমার ডেটা ডব্লিউ / ও / সর্বদা টাইপগুলি সম্পর্কে বিশেষত 'কাস্টম টাইপস' সম্পর্কে অবাক হওয়ার অপ্রয়োজনীয় পদক্ষেপের সিদ্ধান্তের উপায় হিসাবে তালিকা বিকল্পটি বেছে নিতে হবে। যদি মেশিনটি পার্থক্যটি বুঝতে পারে এবং এটি নির্ধারণ করতে পারে যে আমি আসলে কী ধরণের ডেটা নিয়ে কাজ করছি তবে কেন আমি 'আই তেন এলএসই' নির্ধারণের গিরিজগুলির মধ্য দিয়ে কেন সময় নষ্ট করব? আমার দর্শনটি কি আমার পরিবর্তে মেশিনে কাজ করা মেশিনকে কাজ করতে দেবে? বিভিন্ন অবজেক্ট কোড কমান্ডের স্বতন্ত্র পার্থক্যগুলি জানা আপনার কোডটিকে দক্ষ হিসাবে তৈরি করার ক্ষেত্রে অনেক বেশি এগিয়ে যায়।
টম জনসন (একটি প্রবেশ ... এক প্রস্থান)