মূল পার্থক্য
| বিষয় | List<T> | IList<T> |
| প্রকৃতি | কংক্রিট ক্লাস (Concrete Class) | ইন্টারফেস (Interface) |
| ইনস্ট্যান্সিয়েশন | new List<T>() সম্ভব | সরাসরি new IList<T>() সম্ভব না |
| ইমপ্লিমেন্টেশন | IList<T> ইমপ্লিমেন্ট করে | ICollection<T>, IEnumerable<T> থেকে ইনহেরিট |
| উদ্দেশ্য | কোনক্রিট ইমপ্লিমেন্টেশন | অবস্ট্রাকশন, লুজ কাপলিং |
উদাহরণ ১: IList ইনস্ট্যান্সিয়েট করা যায় না
// ❌ কম্পাইল এরর
IList<string> ilist = new IList<string>();
// Error: Cannot create an instance of an interface
উদাহরণ ২: সঠিক ব্যবহার — List কে IList হিসেবে ব্যবহার
using System;
using System.Collections.Generic;
namespace DemoApplication {
class Demo {
static void Main(string[] args) {
// List কে IList রেফারেন্সে রাখা (Polymorphism)
IList<string> ilist = new List<string>();
ilist.Add("Mark");
ilist.Add("John");
// আলাদা List অবজেক্ট
List<string> list = new List<string>();
list.Add("Mark");
list.Add("John");
Console.WriteLine("IList আউটপুট:");
foreach (string s in ilist) Console.WriteLine(s);
Console.WriteLine("List আউটপুট:");
foreach (string s in list) Console.WriteLine(s);
Console.ReadLine();
}
}
}
আউটপুট:
IList আউটপুট:
Mark
John
List আউটপুট:
Mark
John
কোনটি কখন ব্যবহার করবেন?
List<T> ব্যবহার করুন যখন:
- কোনক্রিট ইমপ্লিমেন্টেশন দরকার
- পারফরম্যান্স ক্রিটিক্যাল (ইন্টারফেস ডিসপ্যাচ ছাড়া)
List<T>-স্পেসিফিক মেথড দরকার (Capacity, TrimExcess, BinarySearch, Sort, GetRange, AsReadOnly)
- লোকাল ভেরিয়েবল, প্রাইভেট ফিল্ড
IList<T> ব্যবহার করুন যখন:
- মেথড প্যারামিটার বা রিটার্ন টাইপ (API ডিজাইন)
- লুজ কাপলিং চান — ভবিষ্যতে অন্য ইমপ্লিমেন্টেশন (যেমন আপনার কাস্টম লিস্ট) বসাতে পারেন
- यूनিট টেস্টিং-এ মক করা সহজ
- শুধু ইন্টারফেসে ডিফাইনড মেথডই দরকার
API ডিজাইন উদাহরণ
// ✅ ভালো: IList রিটার্ন করলে ফ্লেক্সিবিলিটি থাকে
public IList<User> GetActiveUsers() {
return _repo.GetActiveUsers().ToList(); // আন্ডারলাইন List, কিন্তু কলার জানতে হবে না
}
// ✅ ভালো: IList প্যারামিটার নিলে যেকোনো IList 임প্লিমেন্টেশন পাস করা যায়
public void ProcessItems(IList<Item> items) { }
// ❌ কম ভালো: List বাধ্য করলে কলারকে List বানাতে হয়
public void ProcessItems(List<Item> items) { }