কেউ আমাকে ব্যাখ্যা করতে পারেন যে আমি কেন সি # তে তালিকার ওপরে তালিকা ব্যবহার করতে চাই?
সম্পর্কিত প্রশ্ন: কেন প্রকাশ করা খারাপ বলে বিবেচিত হয়List<T>
কেউ আমাকে ব্যাখ্যা করতে পারেন যে আমি কেন সি # তে তালিকার ওপরে তালিকা ব্যবহার করতে চাই?
সম্পর্কিত প্রশ্ন: কেন প্রকাশ করা খারাপ বলে বিবেচিত হয়List<T>
উত্তর:
যদি আপনি কোনও লাইব্রেরির মাধ্যমে আপনার শ্রেণিটি প্রকাশ করে যা অন্যরা ব্যবহার করবে তবে আপনি সাধারণত কংক্রিটের প্রয়োগের পরিবর্তে ইন্টারফেসের মাধ্যমে এটি প্রকাশ করতে চান। আপনি যদি পরে অন্য একটি কংক্রিটের ক্লাস ব্যবহার করতে নিজের ক্লাসের বাস্তবায়ন পরিবর্তন করার সিদ্ধান্ত নেন তবে এটি সহায়তা করবে। সেক্ষেত্রে আপনার লাইব্রেরির ব্যবহারকারীদের তাদের কোড আপডেট করার প্রয়োজন হবে না কারণ ইন্টারফেস পরিবর্তন হয় না।
আপনি যদি এটি কেবল অভ্যন্তরীণভাবে ব্যবহার করছেন তবে আপনার এত যত্ন নেই এবং ব্যবহার List<T>
করা ঠিক আছে।
কম জনপ্রিয় উত্তর হ'ল প্রোগ্রামাররা তাদের সফ্টওয়্যারটি বিশ্বজুড়ে পুনরায় ব্যবহার করতে চলেছে বলে মনে করছেন, যখন প্রকৃতপক্ষে বেশিরভাগ প্রকল্পের সংখ্যা খুব কম লোকই বজায় রাখবে এবং তবে ইন্টারফেস-সম্পর্কিত সাউন্ডবাইটগুলি হ'ল, আপনি বিভ্রান্ত করছেন নিজেকে।
আর্কিটেকচার নভোচারী । .NET ফ্রেমওয়ার্কের মধ্যে ইতিমধ্যে যে কোনও কিছু যুক্ত করার সম্ভাবনা আপনি নিজের আইলিস্ট লিখবেন এমন সম্ভাবনাগুলি এতটাই দূরবর্তী যে এটি তাত্ত্বিক জেলি টটগুলি "সেরা অনুশীলনগুলির" জন্য সংরক্ষিত।
স্পষ্টতই যদি আপনাকে কোন সাক্ষাত্কারে কোনটি ব্যবহার করা হয় এমন প্রশ্ন করা হয়, আপনি আইলিস্ট বলেন, হাসুন এবং উভয়ই নিজেকে এত চালাক বলে নিজেকে সন্তুষ্ট দেখায়। বা সর্বজনীন মুখোমুখি এপিআই, আইলিস্টের জন্য। আশা করি আপনি আমার বক্তব্য পাবেন।
IEnumerable<string>
, ফাংশনের List<string>
অভ্যন্তরে আমি আমার সংগ্রহটি উত্পন্ন করতে অভ্যন্তরীণ ব্যাকিং স্টোরের জন্য একটি ব্যবহার করতে পারি, তবে আমি কেবল কলারদের এটির বিষয়বস্তু গণনা করতে চাই, যুক্ত বা সরাতে হবে না। একটি প্যারামিটার হিসাবে একটি ইন্টারফেস গ্রহণ করার অনুরূপ বার্তা যোগাযোগ করে "আমার কাছে স্ট্রিংয়ের সংগ্রহ দরকার, চিন্তিত হবেন না, আমি এটি পরিবর্তন করব না।"
ইন্টারফেস একটি প্রতিশ্রুতি (বা একটি চুক্তি)।
যেমনটি প্রতিশ্রুতিগুলির সাথে সর্বদা হয় - তত ভাল ।
IList
প্রতিশ্রুতিও তাই । এখানে ছোট এবং আরও ভাল প্রতিশ্রুতি কোনটি? এটি যৌক্তিক নয়।
List<T>
, কারণ AddRange
ইন্টারফেসে সংজ্ঞায়িত হয়নি।
IList<T>
প্রতিশ্রুতি দেয় যে তা পালন করতে পারে না। উদাহরণস্বরূপ, কেবলমাত্র পঠনযোগ্য Add
হলে IList<T>
ঘটতে পারে এমন একটি পদ্ধতি রয়েছে । List<T>
অন্যদিকে সর্বদা লিখনযোগ্য এবং এভাবে সর্বদা প্রতিশ্রুতি রাখে। এছাড়াও, নেট 4.6 থেকে, এখন আমাদের কাছে রয়েছে IReadOnlyCollection<T>
এবং IReadOnlyList<T>
যা প্রায় সর্বদা তুলনায় ভাল ফিট IList<T>
। এবং তারা সমবায়। এড়ানো IList<T>
!
IList<T>
। কেউ ঠিক পাশাপাশি প্রয়োগ IReadOnlyList<T>
করতে পারে এবং প্রতিটি পদ্ধতিকেও ব্যতিক্রম করতে পারে। এটি হাঁসের টাইপিংয়ের বিপরীত ধরণের - আপনি এটিকে একটি হাঁস বলেছেন, তবে এটি একটির মতো হাঁপিয়ে উঠতে পারে না। এটি চুক্তির অংশ যদিও, সংকলক এটি প্রয়োগ করতে না পারলেও। যদিও আমি 100% সম্মত হই IReadOnlyList<T>
বা এটি কেবল IReadOnlyCollection<T>
পঠন-অ্যাক্সেসের জন্য ব্যবহার করা উচিত।
কিছু লোক "সর্বদা IList<T>
পরিবর্তে ব্যবহার করুন List<T>
" বলে।
তারা আপনার কাছ থেকে আপনার পদ্ধতি স্বাক্ষর পরিবর্তন করতে চান void Foo(List<T> input)
করতে void Foo(IList<T> input)
।
এই লোকেরা ভুল।
এটি তার চেয়ে আরও উপদ্রবযুক্ত। আপনি যদি IList<T>
আপনার লাইব্রেরিতে পাবলিক ইন্টারফেসের অংশ হিসাবে ফিরে আসছেন তবে ভবিষ্যতে একটি কাস্টম তালিকা তৈরি করার জন্য আপনি নিজেকে আকর্ষণীয় বিকল্পগুলি রেখে যান। আপনার কখনই সেই বিকল্পের প্রয়োজন হতে পারে না তবে এটি একটি যুক্তি। আমি মনে করি এটি কংক্রিটের ধরণের পরিবর্তে ইন্টারফেসটি ফিরিয়ে দেওয়ার পুরো যুক্তি। এটি উল্লেখযোগ্য, তবে এই ক্ষেত্রে এটির একটি গুরুতর ত্রুটি রয়েছে।
একটি সামান্য পাল্টা হিসাবে, আপনি খুঁজে পেতে পারেন যে একক কলারের যে List<T>
কোনও উপায়ে প্রয়োজন, এবং কলিং কোডটি ফাঁকা রয়েছে.ToList()
তবে আরও গুরুত্বপূর্ণ বিষয়, আপনি যদি প্যারামিটার হিসাবে কোনও আইলিস্টকে গ্রহণ করেন তবে আপনি আরও যত্নবান হন, কারণ IList<T>
এবং List<T>
একইভাবে আচরণ করেন না। নামে সাদৃশ্য থাকা সত্ত্বেও এবং একটি ইন্টারফেস ভাগ করেও তারা একই চুক্তি প্রকাশ করে না ।
ধরুন আপনার এই পদ্ধতিটি রয়েছে:
public Foo(List<int> a)
{
a.Add(someNumber);
}
একটি সহায়ক সহকর্মী "রিফ্যাক্টর" গ্রহণ করার পদ্ধতি IList<int>
।
আপনার কোডটি এখন ভেঙে গেছে, কারণ int[]
প্রয়োগগুলি IList<int>
, তবে নির্দিষ্ট আকারের। ICollection<T>
(বেসের IList<T>
) জন্য চুক্তির জন্য কোডটি প্রয়োজন IsReadOnly
যা সংগ্রহ থেকে আইটেমগুলি যুক্ত করতে বা সরানোর চেষ্টা করার আগে পতাকাটি পরীক্ষা করতে এটি ব্যবহার করে । জন্য চুক্তি List<T>
না।
লিসকভ সাবস্টিটিউশন নীতিমালা (সরলীকৃত) বলেছে যে কোনও অতিরিক্ত পূর্বশর্ত বা পোস্টকন্ডিশন ছাড়াই একটি ডাইরেক্ট টাইপটি বেস টাইপের জায়গায় ব্যবহার করতে সক্ষম হওয়া উচিত।
এটি লিসকভের প্রতিস্থাপনের নীতি ভঙ্গ করে বলে মনে হয়।
int[] array = new[] {1, 2, 3};
IList<int> ilist = array;
ilist.Add(4); // throws System.NotSupportedException
ilist.Insert(0, 0); // throws System.NotSupportedException
ilist.Remove(3); // throws System.NotSupportedException
ilist.RemoveAt(0); // throws System.NotSupportedException
তবে তা হয় না। এর উত্তর হ'ল উদাহরণটি আইলিস্ট <T> / আইকোলিকেশন <টি> ভুল ব্যবহার করেছে। আপনি যদি একটি আইকোলিকেশন <T> ব্যবহার করেন তবে আপনাকে ইস্রাডঅনলি পতাকাটি পরীক্ষা করতে হবে।
if (!ilist.IsReadOnly)
{
ilist.Add(4);
ilist.Insert(0, 0);
ilist.Remove(3);
ilist.RemoveAt(0);
}
else
{
// what were you planning to do if you were given a read only list anyway?
}
যদি কেউ আপনাকে একটি অ্যারে বা একটি তালিকা পাস করে তবে আপনি কোডটি প্রতিবার পতাকাটি পরীক্ষা করে যদি ফ্যালব্যাক পান তবে আপনার কোডটি ঠিকঠাক কাজ করবে ... তবে সত্যিই; কে করে? আপনার পদ্ধতির অতিরিক্ত তালিকা নিতে পারে এমন একটি তালিকা প্রয়োজন হলে আপনি আগেই জানেন না; আপনি কি পদ্ধতিতে স্বাক্ষর করে তা নির্দিষ্ট করেন না? আপনি যদি কেবল পঠন তালিকার মতো তালিকা পাস করেন তবে আপনি ঠিক কী করতে যাচ্ছেন int[]
?
আপনি সঠিকভাবে / সঠিকভাবেList<T>
ব্যবহার করে এমন কোডের বিকল্প নিতে পারেন । আপনি গ্যারান্টি দিতে পারবেন না যে আপনি কোনও কোড / কোড ব্যবহার করতে পারেন ।IList<T>
ICollection<T>
IList<T>
ICollection<T>
List<T>
একক দায়িত্বের নীতি / ইন্টারফেস বিভাজন নীতিমালার কাছে প্রচুর যুক্তিতে কংক্রিটের পরিবর্তে অ্যাবস্ট্রাকশনগুলি ব্যবহার করার জন্য একটি আবেদন রয়েছে - সংকীর্ণ সম্ভাব্য ইন্টারফেসের উপর নির্ভর করে। বেশিরভাগ ক্ষেত্রে, আপনি যদি একটি ব্যবহার করছেন List<T>
এবং আপনি যদি মনে করেন যে আপনি এর পরিবর্তে সংকীর্ণ ইন্টারফেসটি ব্যবহার করতে পারেন - তবে কেন নয় IEnumerable<T>
? আপনার যদি আইটেম যুক্ত করার প্রয়োজন না হয় তবে এটি প্রায়শই ভাল ফিট। যদি আপনার সংগ্রহে যোগ করার প্রয়োজন হয় তবে কংক্রিটের ধরণটি ব্যবহার করুন List<T>
।
আমার জন্য IList<T>
(এবং ICollection<T>
) .NET কাঠামোর সবচেয়ে খারাপ অংশ। IsReadOnly
অন্তত বিস্ময়ের নীতি লঙ্ঘন করে। একটি শ্রেণি, যেমন Array
, যা আইটেমগুলি যুক্ত, সন্নিবেশ করা বা সরিয়ে ফেলার অনুমতি দেয় না সেগুলি অ্যাড, সন্নিবেশ এবং সরান পদ্ধতিগুলির সাথে কোনও ইন্টারফেস প্রয়োগ করা উচিত নয়। (এছাড়াও /software/306105/implementing-an-interface-when-you-dont-need-one-of-the-poperties দেখুন )
IList<T>
আপনার প্রতিষ্ঠানের জন্য কি উপযুক্ত ফিট? যদি কোনও সহকর্মী আপনাকে IList<T>
পরিবর্তে কোনও পদ্ধতির স্বাক্ষর ব্যবহার করতে বলে List<T>
, তবে তারা কীভাবে কোনও উপাদানকে যুক্ত করতে চাইবে তা জিজ্ঞাসা করুন IList<T>
। যদি তারা IsReadOnly
(এবং বেশিরভাগ লোকেরা) এটি সম্পর্কে জানেন না , তবে ব্যবহার করবেন না IList<T>
। কখনো।
দ্রষ্টব্য যে আইসরাডিয়ালি পতাকাটি আইকোলিকেশন <T> থেকে আসে এবং এটি নির্দেশ করে যে সংগ্রহগুলি থেকে আইটেমগুলি যুক্ত করা বা সরিয়ে নেওয়া যায়; তবে কেবল জিনিসগুলিকে সত্যই বিভ্রান্ত করার জন্য, এটি প্রতিস্থাপন করা যাবে কিনা তা নির্দেশ করে না, যা অ্যারেগুলির ক্ষেত্রে (যা ইসরেডঅনলিগুলি == সত্য) হতে পারে।
ইস্রাডঅনলি সম্পর্কে আরও তথ্যের জন্য , আইকোলিকেশন <T> এর এমএসডিএন সংজ্ঞা দেখুন I
IsReadOnly
হয় তবে আপনি তার বর্তমান সদস্যদের এখনও সংশোধন করতে পারেন! সম্ভবত যে সম্পত্তি নামকরণ করা উচিত ? true
IList
IsFixedSize
Array
হিসাবে পাস করার সাথে পরীক্ষা করা হয়েছিল IList
, তাই আমি বর্তমান সদস্যদের সংশোধন করতে পারি)
IReadOnlyCollection<T>
এবং IReadOnlyList<T>
যা প্রায় সবসময় চেয়ে ভাল ফিট হয় IList<T>
কিন্তু বিপজ্জনক অলস শব্দার্থবিদ্যা হবে না IEnumerable<T>
। এবং তারা সমবায়। এড়ানো IList<T>
!
List<T>
এর একটি নির্দিষ্ট বাস্তবায়ন IList<T>
, এটি একটি ধারক যা T[]
একটি পূর্ণসংখ্যা সূচক ব্যবহার করে একটি লিনিয়ার অ্যারে হিসাবে একইভাবে সম্বোধন করা যেতে পারে । আপনি যখন IList<T>
পদ্ধতির আর্গুমেন্টের ধরণ হিসাবে উল্লেখ করেন, আপনি কেবলমাত্র উল্লেখ করেন যে আপনার ধারকটির কয়েকটি নির্দিষ্ট ক্ষমতা প্রয়োজন।
উদাহরণস্বরূপ, ইন্টারফেসের স্পেসিফিকেশন ব্যবহার করার জন্য কোনও নির্দিষ্ট ডেটা স্ট্রাকচার প্রয়োগ করে না। List<T>
লিনিয়ার অ্যারে হিসাবে অ্যাক্সেস, ডিলিট এবং যুক্ত করার জন্য একই কার্যকারিতাটির বাস্তবায়ন ঘটে। যাইহোক, আপনি এমন একটি বাস্তবায়ন কল্পনা করতে পারেন যা পরিবর্তে একটি লিঙ্কযুক্ত তালিকার সহায়তায় রয়েছে, যার জন্য শেষ পর্যন্ত উপাদানগুলি যুক্ত করা সস্তা (ধ্রুবক সময়) তবে এলোমেলোভাবে অ্যাক্সেস অনেক ব্যয়বহুল। (দ্রষ্টব্য যে .NET প্রয়োগ LinkedList<T>
করে নাIList<T>
))
এই উদাহরণটি আপনাকে এও বলে দেয় যে আপনার যখন যুক্তি তালিকার অন্তর্ভুক্ত নয়, তবে ইন্টারফেসটি নয়, বাস্তবায়ন নির্দিষ্ট করতে হবে তখন এই পরিস্থিতিতে উদাহরণস্বরূপ, যখনই আপনার একটি বিশেষ অ্যাক্সেস পারফরম্যান্স বৈশিষ্ট্য প্রয়োজন। এটি সাধারণত ধারকটির নির্দিষ্ট প্রয়োগের জন্য গ্যারান্টিযুক্ত ( List<T>
ডকুমেন্টেশন: "এটি IList<T>
জেনেরিক ইন্টারফেসকে এমন অ্যারে ব্যবহার করে যার আকার ডায়নামিকভাবে প্রয়োজনীয় হিসাবে বৃদ্ধি করা হয়" "))
অতিরিক্তভাবে, আপনি আপনার প্রয়োজন সবচেয়ে কম কার্যকারিতা প্রকাশের বিবেচনা করতে পারেন। উদাহরণ স্বরূপ. যদি আপনাকে তালিকার বিষয়বস্তু পরিবর্তন করার প্রয়োজন না হয়, আপনার সম্ভবত ব্যবহারের কথা বিবেচনা করা উচিত IEnumerable<T>
, যা IList<T>
প্রসারিত।
LinkedList<T>
গ্রহণ বনাম List<T>
বনাম IList<T>
সব যোগাযোগ কর্মক্ষমতা কোড দ্বারা প্রয়োজনীয় গ্যারান্টী এর কিছু বলা হচ্ছে।
আমি প্রশ্নটি কিছুটা ঘুরিয়ে দেব, কেন আপনার কংক্রিট প্রয়োগের ক্ষেত্রে ইন্টারফেসটি ব্যবহার করা উচিত তা প্রমাণ করার পরিবর্তে, কেন আপনি ইন্টারফেসের পরিবর্তে কংক্রিটের প্রয়োগটি ব্যবহার করবেন তা প্রমাণ করার চেষ্টা করুন। আপনি যদি এটি সমর্থন করতে না পারেন তবে ইন্টারফেসটি ব্যবহার করুন।
IList <T> হ'ল একটি ইন্টারফেস যাতে আপনি অন্য শ্রেণীর উত্তরাধিকারী হন এবং তালিকা বন্টনের সময় আইটি তালিকা <T> প্রয়োগ করতে পারেন <T> আপনাকে তা করতে বাধা দেয়।
উদাহরণস্বরূপ, যদি একটি ক্লাস A থাকে এবং আপনার শ্রেণি বি এর উত্তরাধিকার সূত্রে আসে তবে আপনি তালিকা <T> ব্যবহার করতে পারবেন না
class A : B, IList<T> { ... }
টিডিডি এবং ওওপির একটি নীতি সাধারণত একটি ইন্টারফেসে প্রোগ্রামিং করে যা বাস্তবায়ন হয় না।
এই নির্দিষ্ট ক্ষেত্রে যেহেতু আপনি মূলত কোনও ভাষা নির্মাণের বিষয়ে কথা বলছেন, কোনও কাস্টম হিসাবে এটি সাধারণত বিবেচ্য নয়, তবে উদাহরণস্বরূপ বলুন যে আপনি খুঁজে পেয়েছেন তালিক আপনার প্রয়োজনীয় কিছু সমর্থন করে না। আপনি যদি বাকী অ্যাপ্লিকেশনটিতে আইলিস্ট ব্যবহার করে থাকেন তবে আপনি নিজের কাস্টম ক্লাসের সাহায্যে তালিকাটি প্রসারিত করতে পারতেন এবং এখনও তা রিফ্যাক্টরিং ছাড়াই পাস করতে সক্ষম হতেন।
এটি করার ব্যয়টি ন্যূনতম, পরে কেন নিজেকে মাথা ব্যথা বাঁচাতে হবে না? ইন্টারফেসের নীতিটি এটি সম্পর্কে।
public void Foo(IList<Bar> list)
{
// Do Something with the list here.
}
এই ক্ষেত্রে আপনি যে কোনও ক্লাসে পাস করতে পারেন যা IList <বার> ইন্টারফেস প্রয়োগ করে। আপনি যদি এর পরিবর্তে তালিকা <বার> ব্যবহার করেন তবে কেবল একটি তালিকা <বার> উদাহরণটি প্রবেশ করতে পারে।
তালিকাটি <বার> উপায়ের চেয়ে আইলিস্ট <বার> উপায়টি আলগাভাবে মিশ্রিত।
IList প্রশ্নগুলির (বা উত্তর) এর তুলনায় এই তালিকার কোনওটিই স্বাক্ষরের পার্থক্যের কথা উল্লেখ করে ris (আমি এই প্রশ্নটি কেন এসও তে অনুসন্ধান করেছি!)
সুতরাং লিস্টে অন্তর্ভুক্ত থাকা পদ্ধতিগুলি যা আইলিস্টে পাওয়া যায় না, কমপক্ষে নেট নেট হিসাবে 4.5.৪ (প্রায় 2015)
Reverse
এবং ToArray
আইইনুমেবল <T> ইন্টারফেসের জন্য এক্সটেনশন পদ্ধতি হ'ল IList <T> থেকে প্রাপ্ত।
List
এর অন্যান্য বাস্তবায়ন নয় IList
।
বাস্তবায়নের উপর ইন্টারফেস ব্যবহারের জন্য সবচেয়ে গুরুত্বপূর্ণ ক্ষেত্রেটি হল আপনার এপিআই-র পরামিতি। যদি আপনার এপিআই একটি তালিকা পরামিতি নেয়, তবে যে কেউ এটি ব্যবহার করে তাকে তালিকা ব্যবহার করতে হবে। যদি প্যারামিটারের প্রকারটি IList হয় তবে কলারের আরও অনেক বেশি স্বাধীনতা রয়েছে এবং আপনি কখনও কখনও ক্লাস করেনি এমন ক্লাসগুলি ব্যবহার করতে পারেন যা আপনার কোডটি লেখার সময় উপস্থিত ছিল না।
NET 5.0 এর পরিবর্তে কী System.Collections.Generic.List<T>
হয় System.Collection.Generics.LinearList<T>
। .NET সর্বদা নামের মালিক List<T>
তবে তারা গ্যারান্টি দেয় এটি IList<T>
একটি চুক্তি। সুতরাং আইএমএইচও আমরা (ন্যূনতম আমি) কারও নাম ব্যবহার করার কথা নেই (যদিও এটি এই ক্ষেত্রে নেট) এবং পরে সমস্যায় পড়ি।
ব্যবহারের ক্ষেত্রে IList<T>
, কলার সর্বদা কাজ করার জন্য গ্যারান্টেড জিনিস থাকে এবং প্রয়োগকারী কোনও বিকল্প কংক্রিট বাস্তবায়নের অন্তর্নিহিত সংগ্রহটি পরিবর্তন করতে মুক্ত isIList
সমস্ত ধারণাগুলি মূলত উপরের উত্তরগুলির বেশিরভাগ ক্ষেত্রে কেন কংক্রিট বাস্তবায়নের ক্ষেত্রে ইন্টারফেস ব্যবহার করে সে সম্পর্কে বলা আছে।
IList<T> defines those methods (not including extension methods)
IList<T>
এমএসডিএন লিঙ্ক
List<T>
এই নয়টি পদ্ধতি প্রয়োগ করে (এক্সটেনশন পদ্ধতিগুলি সহ নয়) এর উপরে এটি প্রায় 41 টি পাবলিক পদ্ধতি রয়েছে যা আপনার অ্যাপ্লিকেশনটিতে কোনটি ব্যবহার করবেন সে সম্পর্কে আপনার বিবেচনায় ওজন রয়েছে।
List<T>
এমএসডিএন লিঙ্ক
আপনি কারণ হতে পারে যে কোনও আইলিস্ট বা আইকোলিকেশন সংজ্ঞায়িত করা আপনার ইন্টারফেসের অন্যান্য প্রয়োগের জন্য উন্মুক্ত হবে।
আপনার কাছে একটি আইওর্ডার রিপোসিটোরি থাকতে পারে যা আইলিস্ট বা আইকোলিকেশন দুটিতে অর্ডার সংকলনকে সংজ্ঞায়িত করে। আপনার আইলিস্ট বা আইকোলিকেশন দ্বারা সংজ্ঞায়িত "বিধি" মেনে চলার পরেও অর্ডারগুলির একটি তালিকা সরবরাহ করার জন্য আপনার কাছে বিভিন্ন ধরণের বাস্তবায়ন থাকতে পারে।
অন্যান্য পোস্টারের পরামর্শ অনুযায়ী আইএললিস্ট <> প্রায় সবসময়ই পছন্দনীয়, তবে মনে রাখবেন যে ডাব্লুসিএফ ডেটা কন্ট্রাক্টরিশায়ালাইজারের সাথে সিরিয়ালীকরণ / ডিসরিয়ালাইজেশন একাধিক চক্রের মাধ্যমে < .NET 3.5 এসপি 1 এ একটি বাগ রয়েছে ।
এই বাগটি ঠিক করার জন্য এখন একটি এসপি রয়েছে: কেবি 971030 30
ইন্টারফেসটি নিশ্চিত করে যে আপনি অন্ততপক্ষে যে পদ্ধতিগুলি প্রত্যাশা করছেন তা পাবেন ; ইন্টারফেসের সংজ্ঞা সম্পর্কে সচেতন হওয়া। ইন্টারফেস উত্তরাধিকার সূত্রে প্রাপ্ত কোনও শ্রেণীর দ্বারা প্রয়োগ করা সমস্ত বিমূর্ত পদ্ধতি। সুতরাং কেউ যদি ইন্টারফেস থেকে কিছু সংযোজন কার্যকারিতার জন্য উত্তরাধিকার সূত্রে ব্যতীত তার নিজস্ব একটি বিশাল শ্রেণি তৈরি করে এবং সেগুলি আপনার কোনও কাজে আসে না, তবে একটি সাবক্লাসের রেফারেন্স ব্যবহার করা ভাল (এই ক্ষেত্রে ক্ষেত্রে ইন্টারফেস) এবং এটিতে কংক্রিট শ্রেণীর অবজেক্ট বরাদ্দ করুন।
অতিরিক্ত সুবিধা হ'ল আপনার কোডটি কংক্রিট শ্রেণীর যে কোনও পরিবর্তন থেকে নিরাপদ কারণ আপনি কেবলমাত্র কংক্রিট শ্রেণির কয়েকটি পদ্ধতির সাবস্ক্রাইব করছেন এবং সেগুলি হ'ল যতক্ষণ পর্যন্ত আপনি যে ইন্টারফেসটি থেকে কংক্রিট বর্গের উত্তরাধিকার সূত্রে প্রবেশ করবে ব্যবহার. সুতরাং আপনার সুরক্ষার জন্য এবং কোডারকে স্বাধীনতার জন্য যারা কংক্রিটের ক্লাসে আরও কার্যকারিতা পরিবর্তন করতে বা আরও কার্যকারিতা যুক্ত করতে কংক্রিট বাস্তবায়ন লিখছেন।
আপনি এই যুক্তিটি একাধিক কোণ থেকে বিশুদ্ধরূপে ওও পদ্ধতির সাথে দেখতে পারেন যা কোনও ইন্টারফেসের বিরুদ্ধে প্রোগ্রাম করার কথা বলে না যা বাস্তবায়ন নয়। এই চিন্তাভাবনার সাথে, আইলিস্ট ব্যবহার করা একইভাবে অধ্যক্ষটিকে অনুসরণ করে ঘুরতে এবং ইন্টারফেসগুলি ব্যবহার করে যা আপনি স্ক্র্যাচ থেকে সংজ্ঞায়িত করেন। আমি সাধারণভাবে কোনও ইন্টারফেসের মাধ্যমে সরবরাহযোগ্য পরিমাণ এবং নমনীয়তার কারণগুলিতেও বিশ্বাস করি। যদি IList <T> প্রবর্তনকারী কোনও শ্রেণীর প্রসারিত বা পরিবর্তন করা দরকার হয় তবে গ্রাহক কোডটি পরিবর্তন করতে হবে না; এটি জানে যে আইলিস্ট ইন্টারফেস চুক্তিটি কী মেনে চলে। তবে পরিবর্তিত ক্লাসে একটি কংক্রিট বাস্তবায়ন এবং তালিকা <টি> ব্যবহার করে কলিং কোডটিও পরিবর্তিত হতে পারে। কারণ IList <T> মেনে চলা কোনও শ্রেণি একটি নির্দিষ্ট আচরণের গ্যারান্টি দেয় যা তালিকার <T> ব্যবহার করে কংক্রিটের ধরণের দ্বারা গ্যারান্টিযুক্ত নয়।
তালিকায় <টি> ডিফল্ট বাস্তবায়ন পরিবর্তন ভালো কিছু করার শক্তি না থাকার একটি বর্গ বাস্তবায়নকারী IList উপর <টি> বলতে .Add, .remove বা অন্য কোন IList পদ্ধতি ডেভেলপার একটি দেয় অনেক নমনীয়তা ও ক্ষমতার, অন্যথায় পূর্বনির্ধারিত তালিকা অনুসারে <টি>
সাধারণত, আপনার জনসাধারণের মুখোমুখি এপিআইতে আইলিস্ট ব্যবহার করা (যখন উপযুক্ত, এবং তালিকা শব্দার্থবিজ্ঞানের প্রয়োজন হয়), এবং তারপরে এপিআই বাস্তবায়নের জন্য অভ্যন্তরীণভাবে তালিকাভুক্ত করা একটি ভাল পন্থা। এটি আপনাকে ক্লাস ব্যবহার করে এমন কোড না ভেঙে আইলিস্টের ভিন্ন প্রয়োগে পরিবর্তিত হতে দেয়।
ক্লাসের নাম তালিকার পরবর্তী। নেট ফ্রেমওয়ার্কে পরিবর্তন করা যেতে পারে তবে ইন্টারফেসটি চুক্তি হওয়ায় ইন্টারফেসটি কখনই পরিবর্তন হতে পারে না।
মনে রাখবেন যে, যদি আপনার এপিআইটি কেবল ফোরচ লুপ ইত্যাদিতে ব্যবহার করা হয় তবে আপনি তার পরিবর্তে কেবলমাত্র আইনিউমারেবল প্রকাশের বিষয়টি বিবেচনা করতে পারেন।