<T> বা আইলিস্ট <T> [বন্ধ] তালিকা


495

কেউ আমাকে ব্যাখ্যা করতে পারেন যে আমি কেন সি # তে তালিকার ওপরে তালিকা ব্যবহার করতে চাই?

সম্পর্কিত প্রশ্ন: কেন প্রকাশ করা খারাপ বলে বিবেচিত হয়List<T>


1
"ইন্টারফেসের কোডে একটি প্রয়োগ নয়" এর জন্য ইন্টারনেট অনুসন্ধান এবং আপনি সারা দিন পড়তে পারেন .. এবং কয়েকটি h0ly যুদ্ধের সন্ধান করুন।
গ্রানাডা কোডার

উত্তর:


446

যদি আপনি কোনও লাইব্রেরির মাধ্যমে আপনার শ্রেণিটি প্রকাশ করে যা অন্যরা ব্যবহার করবে তবে আপনি সাধারণত কংক্রিটের প্রয়োগের পরিবর্তে ইন্টারফেসের মাধ্যমে এটি প্রকাশ করতে চান। আপনি যদি পরে অন্য একটি কংক্রিটের ক্লাস ব্যবহার করতে নিজের ক্লাসের বাস্তবায়ন পরিবর্তন করার সিদ্ধান্ত নেন তবে এটি সহায়তা করবে। সেক্ষেত্রে আপনার লাইব্রেরির ব্যবহারকারীদের তাদের কোড আপডেট করার প্রয়োজন হবে না কারণ ইন্টারফেস পরিবর্তন হয় না।

আপনি যদি এটি কেবল অভ্যন্তরীণভাবে ব্যবহার করছেন তবে আপনার এত যত্ন নেই এবং ব্যবহার List<T>করা ঠিক আছে।


19
আমি (সূক্ষ্ম) পার্থক্য বুঝতে পারছি না, এমন কোনও উদাহরণ আছে যা আপনি আমাকে নির্দেশ করতে পারেন?
স্টিংজি জ্যাক

134
বলুন আপনি মূলত তালিকা <টি> ব্যবহার করেছিলেন এবং একটি বিশেষায়িত কেসআইসেনসেটিভলিস্ট <T> ব্যবহার করতে পরিবর্তন করতে চেয়েছিলেন, উভয়ই IList <T> প্রয়োগ করে। আপনি যদি কংক্রিটের ধরণটি ব্যবহার করেন তবে সমস্ত কলার আপডেট হওয়া দরকার। যদি IList হিসাবে প্রকাশ করা হয় <T> কলকারী পরিবর্তন করতে হবে না।
tvanfosson

46
আহ। ঠিক আছে. আমি তা পেয়েছি একটি চুক্তির জন্য সর্বনিম্ন সাধারণ ডিনোমিনিটর বাছাই করা। ধন্যবাদ!
স্টিংজি জ্যাক

16
এই নীতিটি এনক্যাপসুলেশনের উদাহরণ, অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের তিনটি স্তম্ভের মধ্যে একটি। ধারণাটি হ'ল আপনি ব্যবহারকারীর কাছ থেকে প্রয়োগের বিশদটি গোপন করুন এবং তার পরিবর্তে তাদের একটি স্থিতিশীল ইন্টারফেস সরবরাহ করুন। এটি ভবিষ্যতে পরিবর্তিত হতে পারে এমন বিশদগুলির উপর নির্ভরতা হ্রাস করা।
জেসন

14
এটিও লক্ষ করুন যে টি []: আইলিস্ট <T>, যাতে কার্য সম্পাদনের কারণে আপনি সর্বদা একটি তালিকা <T> আপনার প্রক্রিয়া থেকে একটি টি ফিরে [[] ফেরানোর দিকে বদল করতে পারেন, এবং যদি পদ্ধতিটি আইএলিস্ট ফেরত ঘোষণা করা হয় <T> (বা সম্ভবত আইকোলিকেশন <টি>, বা আইনিউমেবল <টি>) আর কিছুই পরিবর্তন করার দরকার নেই।
yfeldblum

322

কম জনপ্রিয় উত্তর হ'ল প্রোগ্রামাররা তাদের সফ্টওয়্যারটি বিশ্বজুড়ে পুনরায় ব্যবহার করতে চলেছে বলে মনে করছেন, যখন প্রকৃতপক্ষে বেশিরভাগ প্রকল্পের সংখ্যা খুব কম লোকই বজায় রাখবে এবং তবে ইন্টারফেস-সম্পর্কিত সাউন্ডবাইটগুলি হ'ল, আপনি বিভ্রান্ত করছেন নিজেকে।

আর্কিটেকচার নভোচারী । .NET ফ্রেমওয়ার্কের মধ্যে ইতিমধ্যে যে কোনও কিছু যুক্ত করার সম্ভাবনা আপনি নিজের আইলিস্ট লিখবেন এমন সম্ভাবনাগুলি এতটাই দূরবর্তী যে এটি তাত্ত্বিক জেলি টটগুলি "সেরা অনুশীলনগুলির" জন্য সংরক্ষিত।

সফটওয়্যার নভোচারী

স্পষ্টতই যদি আপনাকে কোন সাক্ষাত্কারে কোনটি ব্যবহার করা হয় এমন প্রশ্ন করা হয়, আপনি আইলিস্ট বলেন, হাসুন এবং উভয়ই নিজেকে এত চালাক বলে নিজেকে সন্তুষ্ট দেখায়। বা সর্বজনীন মুখোমুখি এপিআই, আইলিস্টের জন্য। আশা করি আপনি আমার বক্তব্য পাবেন।


65
আপনার তীব্র উত্তর নিয়ে আমার দ্বিমত পোষণ করতে হবে। ওভার-আর্কিটেকচারটি আসল সমস্যা হওয়ার সংবেদন নিয়ে আমি সম্পূর্ণ একমত নই। তবে আমি মনে করি যে সংগ্রহগুলির ক্ষেত্রে বিশেষত ইন্টারফেসগুলি সত্যিই জ্বলে। বলুন আমার ফাংশন রয়েছে যা ফিরবে IEnumerable<string>, ফাংশনের List<string>অভ্যন্তরে আমি আমার সংগ্রহটি উত্পন্ন করতে অভ্যন্তরীণ ব্যাকিং স্টোরের জন্য একটি ব্যবহার করতে পারি, তবে আমি কেবল কলারদের এটির বিষয়বস্তু গণনা করতে চাই, যুক্ত বা সরাতে হবে না। একটি প্যারামিটার হিসাবে একটি ইন্টারফেস গ্রহণ করার অনুরূপ বার্তা যোগাযোগ করে "আমার কাছে স্ট্রিংয়ের সংগ্রহ দরকার, চিন্তিত হবেন না, আমি এটি পরিবর্তন করব না।"
জোশপুরি

38
সফ্টওয়্যার ডেভলপমেন্ট হ'ল অনুবাদ উদ্দেশ্য সম্পর্কে। আপনি যদি মনে করেন যে ইন্টারফেসগুলি কেবল মাত্রাতিরিক্ত আকারের, গ্র্যান্ডিজ আর্কিটেকচার তৈরির জন্য দরকারী এবং ছোট ছোট দোকানে কোনও স্থান নেই তবে আমি আশা করি যে সাক্ষাত্কারে আপনার কাছ থেকে বসা ব্যক্তিটি আমার নয়।
জোশপুরি

48
কারও কাছে এই আরেক বলতে হয়েছিল ... ফলস্বরূপ ঘৃণা মেইলকে ধাওয়া করার জন্য আপনি যদি বিভিন্ন ধরণের একাডেমিক প্যাটার্ন পেয়ে থাকেন তবে। ইন্টারফেসের সাহায্যে একটি ছোট অ্যাপ্লিকেশন লোড করা এবং "অনুসন্ধান সংজ্ঞা" এ ক্লিক করা যখন আমাদের সমস্যার জন্য এটির ঘৃণা করে, আমাদের সবার জন্য +1 সমস্যাটির উত্স বাদে অন্য কোথাও নিয়ে যায় ... আমি কি "আর্কিটেকচার নভোচারী" শব্দটি ধার করতে পারি? আমি দেখতে পাচ্ছি এটি কার্যকর হবে।
গেটস

6
যদি এটি সম্ভব হয়, আমি আপনাকে এই উত্তরের জন্য 1000 পয়েন্ট দেব। : ডি
স্যামুয়েল

8
আমি প্যাটার্ন তাড়ানোর বিস্তৃত ফলাফল সম্পর্কে বলছিলাম। সাধারণ ইন্টারফেসের জন্য ইন্টারফেসগুলি ভাল, কোনও প্যাটার্ন তাড়া করার জন্য অতিরিক্ত স্তর রয়েছে, খারাপ।
গ্যাটস

186

ইন্টারফেস একটি প্রতিশ্রুতি (বা একটি চুক্তি)।

যেমনটি প্রতিশ্রুতিগুলির সাথে সর্বদা হয় - তত ভাল


56
সবসময় ভাল না, রাখা আরও সহজ! :)
কર્ક ব্রডহর্স্ট

5
আমি এটা পেতে পারি না। IListপ্রতিশ্রুতিও তাই । এখানে ছোট এবং আরও ভাল প্রতিশ্রুতি কোনটি? এটি যৌক্তিক নয়।
নওফাল

3
অন্য যে কোনও শ্রেণির জন্য আমি সম্মত হব। তবে এর জন্য নয় List<T>, কারণ AddRangeইন্টারফেসে সংজ্ঞায়িত হয়নি।
জেসি ডি উইট

3
এটি এই বিশেষ ক্ষেত্রে সত্যই সহায়ক নয়। সেরা প্রতিশ্রুতি যে রাখা হয়। IList<T>প্রতিশ্রুতি দেয় যে তা পালন করতে পারে না। উদাহরণস্বরূপ, কেবলমাত্র পঠনযোগ্য Addহলে IList<T>ঘটতে পারে এমন একটি পদ্ধতি রয়েছে । List<T>অন্যদিকে সর্বদা লিখনযোগ্য এবং এভাবে সর্বদা প্রতিশ্রুতি রাখে। এছাড়াও, নেট 4.6 থেকে, এখন আমাদের কাছে রয়েছে IReadOnlyCollection<T>এবং IReadOnlyList<T>যা প্রায় সর্বদা তুলনায় ভাল ফিট IList<T>। এবং তারা সমবায়। এড়ানো IList<T>!
জুনটজু

@ZunTzu আমি যে কেউ বন্ধ হিসাবে একটি চপল এক জ্ঞাতসারে উপস্থাপন চুক্তি ভঙ্গ করেছে একটি অপরিবর্তনীয় সংগ্রহ ক্ষণস্থায়ী তর্ক করা চাই - এটা চুক্তি নিজেই যেমন নিয়ে একটি সমস্যা নয় IList<T>। কেউ ঠিক পাশাপাশি প্রয়োগ IReadOnlyList<T>করতে পারে এবং প্রতিটি পদ্ধতিকেও ব্যতিক্রম করতে পারে। এটি হাঁসের টাইপিংয়ের বিপরীত ধরণের - আপনি এটিকে একটি হাঁস বলেছেন, তবে এটি একটির মতো হাঁপিয়ে উঠতে পারে না। এটি চুক্তির অংশ যদিও, সংকলক এটি প্রয়োগ করতে না পারলেও। যদিও আমি 100% সম্মত হই IReadOnlyList<T>বা এটি কেবল IReadOnlyCollection<T>পঠন-অ্যাক্সেসের জন্য ব্যবহার করা উচিত।
শেলবি ওল্ডফিল্ড

93

কিছু লোক "সর্বদা 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


5
দুর্দান্ত, দুর্দান্ত উত্তর। আমি এটি যুক্ত করতে চাই, এমনকি যদি এটির জন্য IsReadOnlyহয় তবে আপনি তার বর্তমান সদস্যদের এখনও সংশোধন করতে পারেন! সম্ভবত যে সম্পত্তি নামকরণ করা উচিত ? trueIListIsFixedSize
xofz

(এটি একটি Arrayহিসাবে পাস করার সাথে পরীক্ষা করা হয়েছিল IList, তাই আমি বর্তমান সদস্যদের সংশোধন করতে পারি)
xofz

1
@ সাম্পিয়ারসন আইলিস্টে .NET 1 তে একটি ইসফিক্সডসাইজ সম্পত্তি ছিল। নেট 2.0 এর জেনেরিক আইলিস্ট <T> এ অন্তর্ভুক্ত নেই যেখানে এটি ইসরেডঅনালি দ্বারা একীকরণ করা হয়েছিল, যার ফলে অ্যারেগুলি প্রায় অবাক করা আচরণের জন্ম দেয়। সূক্ষ্ম পার্থক্য সম্পর্কে এখানে একটি বিস্তারিত মস্তিষ্কে গলানোর ব্লগ রয়েছে: enterprisecraftsmanship.com/2014/11/22/…
পারফেকশনিস্ট

7
দুর্দান্ত উত্তর! এছাড়াও, .NET 4.6 যেহেতু, আমরা এখন IReadOnlyCollection<T>এবং IReadOnlyList<T>যা প্রায় সবসময় চেয়ে ভাল ফিট হয় IList<T>কিন্তু বিপজ্জনক অলস শব্দার্থবিদ্যা হবে না IEnumerable<T>। এবং তারা সমবায়। এড়ানো IList<T>!
জুনটজু

37

List<T>এর একটি নির্দিষ্ট বাস্তবায়ন IList<T>, এটি একটি ধারক যা T[]একটি পূর্ণসংখ্যা সূচক ব্যবহার করে একটি লিনিয়ার অ্যারে হিসাবে একইভাবে সম্বোধন করা যেতে পারে । আপনি যখন IList<T>পদ্ধতির আর্গুমেন্টের ধরণ হিসাবে উল্লেখ করেন, আপনি কেবলমাত্র উল্লেখ করেন যে আপনার ধারকটির কয়েকটি নির্দিষ্ট ক্ষমতা প্রয়োজন।

উদাহরণস্বরূপ, ইন্টারফেসের স্পেসিফিকেশন ব্যবহার করার জন্য কোনও নির্দিষ্ট ডেটা স্ট্রাকচার প্রয়োগ করে না। List<T>লিনিয়ার অ্যারে হিসাবে অ্যাক্সেস, ডিলিট এবং যুক্ত করার জন্য একই কার্যকারিতাটির বাস্তবায়ন ঘটে। যাইহোক, আপনি এমন একটি বাস্তবায়ন কল্পনা করতে পারেন যা পরিবর্তে একটি লিঙ্কযুক্ত তালিকার সহায়তায় রয়েছে, যার জন্য শেষ পর্যন্ত উপাদানগুলি যুক্ত করা সস্তা (ধ্রুবক সময়) তবে এলোমেলোভাবে অ্যাক্সেস অনেক ব্যয়বহুল। (দ্রষ্টব্য যে .NET প্রয়োগ LinkedList<T>করে নাIList<T> ))

এই উদাহরণটি আপনাকে এও বলে দেয় যে আপনার যখন যুক্তি তালিকার অন্তর্ভুক্ত নয়, তবে ইন্টারফেসটি নয়, বাস্তবায়ন নির্দিষ্ট করতে হবে তখন এই পরিস্থিতিতে উদাহরণস্বরূপ, যখনই আপনার একটি বিশেষ অ্যাক্সেস পারফরম্যান্স বৈশিষ্ট্য প্রয়োজন। এটি সাধারণত ধারকটির নির্দিষ্ট প্রয়োগের জন্য গ্যারান্টিযুক্ত ( List<T>ডকুমেন্টেশন: "এটি IList<T>জেনেরিক ইন্টারফেসকে এমন অ্যারে ব্যবহার করে যার আকার ডায়নামিকভাবে প্রয়োজনীয় হিসাবে বৃদ্ধি করা হয়" "))

অতিরিক্তভাবে, আপনি আপনার প্রয়োজন সবচেয়ে কম কার্যকারিতা প্রকাশের বিবেচনা করতে পারেন। উদাহরণ স্বরূপ. যদি আপনাকে তালিকার বিষয়বস্তু পরিবর্তন করার প্রয়োজন না হয়, আপনার সম্ভবত ব্যবহারের কথা বিবেচনা করা উচিত IEnumerable<T>, যা IList<T>প্রসারিত।


আইলিস্টের পরিবর্তে আইনিউমারেবল ব্যবহার সম্পর্কে আপনার শেষ বক্তব্যটি সম্পর্কে। এই সবসময় বাঞ্ছনীয় নয়, WPF উদাহরণ যা ঠিক তাই একটি লেফাফা IList বস্তুর তৈরি করবে জন্য perf একজন প্রভাব থাকবে নিতে - msdn.microsoft.com/en-us/library/bb613546.aspx
পাতাল

1
দুর্দান্ত উত্তর, পারফরম্যান্স গ্যারান্টি এমন একটি জিনিস যা কোনও ইন্টারফেস বিতরণ করতে পারে না। কিছু কোডে এটি বেশ গুরুত্বপূর্ণ হতে পারে এবং কংক্রিটের ক্লাস ব্যবহার করা আপনার অভিপ্রায়, সেই নির্দিষ্ট শ্রেণীর জন্য আপনার প্রয়োজনীয়তার যোগাযোগ করে। অন্যদিকে একটি ইন্টারফেস বলছে "আমাকে কেবল এই পদ্ধতির সেটটি কল করতে হবে, অন্য কোনও চুক্তি প্রয়োগ করা হয়নি।"
joshperry

1
@ জোশ্পেরি যদি কোনও ইন্টারফেসের পারফরম্যান্স আপনাকে বিরক্ত করে তবে আপনি প্রথমে ভুল প্ল্যাটফর্মে রয়েছেন। ইমো, এটি মাইক্রোপটিমাইজেশন।
নওফাল

@ নওফাল আমি ইন্টারফেসের পারফরম্যান্সের পক্ষ / মন্তব্য সম্পর্কে মন্তব্য করছিলাম না। আমি এই বিষয়ে একমত এবং মন্তব্য করছি যে আপনি যখন যুক্তি হিসাবে একটি কংক্রিট শ্রেণিকে প্রকাশ করতে চান, আপনি একটি পারফরম্যান্স অভিপ্রায়টি যোগাযোগ করতে সক্ষম হন। টেকিং LinkedList<T>গ্রহণ বনাম List<T>বনাম IList<T>সব যোগাযোগ কর্মক্ষমতা কোড দ্বারা প্রয়োজনীয় গ্যারান্টী এর কিছু বলা হচ্ছে।
জোশপুরি

28

আমি প্রশ্নটি কিছুটা ঘুরিয়ে দেব, কেন আপনার কংক্রিট প্রয়োগের ক্ষেত্রে ইন্টারফেসটি ব্যবহার করা উচিত তা প্রমাণ করার পরিবর্তে, কেন আপনি ইন্টারফেসের পরিবর্তে কংক্রিটের প্রয়োগটি ব্যবহার করবেন তা প্রমাণ করার চেষ্টা করুন। আপনি যদি এটি সমর্থন করতে না পারেন তবে ইন্টারফেসটি ব্যবহার করুন।


1
এটি সম্পর্কে চিন্তা করার খুব আকর্ষণীয় উপায়। প্রোগ্রামিংয়ের সময় চিন্তা করার একটি ভাল উপায় - ধন্যবাদ।
চিনাবাদাম

ভাল বলেছ! ইন্টারফেসটি যেহেতু আরও নমনীয় পদ্ধতির, তাই কংক্রিট বাস্তবায়ন আপনাকে কী কিনেছে তা সত্যই প্রমাণ করতে হবে।
কোরি হাউজ

9
ভাবনার দুর্দান্ত উপায়। তবুও আমি এর উত্তর দিতে পারি: আমার কারণটিকে অ্যাড্রেঞ্জ ()
পিপিসি

4
আমার কারণটিকে অ্যাড () বলা হয়। কখনও কখনও আপনি একটি তালিকা চান যা আপনি জানেন অতিরিক্ত উপাদানগুলি নিতে পারে, অবশ্যই? আমার উত্তর দেখুন।
পারফেকশনিস্ট

19

IList <T> হ'ল একটি ইন্টারফেস যাতে আপনি অন্য শ্রেণীর উত্তরাধিকারী হন এবং তালিকা বন্টনের সময় আইটি তালিকা <T> প্রয়োগ করতে পারেন <T> আপনাকে তা করতে বাধা দেয়।

উদাহরণস্বরূপ, যদি একটি ক্লাস A থাকে এবং আপনার শ্রেণি বি এর উত্তরাধিকার সূত্রে আসে তবে আপনি তালিকা <T> ব্যবহার করতে পারবেন না

class A : B, IList<T> { ... }

15

টিডিডি এবং ওওপির একটি নীতি সাধারণত একটি ইন্টারফেসে প্রোগ্রামিং করে যা বাস্তবায়ন হয় না।

এই নির্দিষ্ট ক্ষেত্রে যেহেতু আপনি মূলত কোনও ভাষা নির্মাণের বিষয়ে কথা বলছেন, কোনও কাস্টম হিসাবে এটি সাধারণত বিবেচ্য নয়, তবে উদাহরণস্বরূপ বলুন যে আপনি খুঁজে পেয়েছেন তালিক আপনার প্রয়োজনীয় কিছু সমর্থন করে না। আপনি যদি বাকী অ্যাপ্লিকেশনটিতে আইলিস্ট ব্যবহার করে থাকেন তবে আপনি নিজের কাস্টম ক্লাসের সাহায্যে তালিকাটি প্রসারিত করতে পারতেন এবং এখনও তা রিফ্যাক্টরিং ছাড়াই পাস করতে সক্ষম হতেন।

এটি করার ব্যয়টি ন্যূনতম, পরে কেন নিজেকে মাথা ব্যথা বাঁচাতে হবে না? ইন্টারফেসের নীতিটি এটি সম্পর্কে।


3
যদি আপনার বর্ধিত তালিকা <টি> উত্তরাধিকার সূত্রে <T> হয়, তবে আপনি এখনও এটি তালিকা <টি> চুক্তিতে ফিট করতে পারেন। এই যুক্তিটি কেবল তখনই কার্যকর হয় যদি আপনি নিজের আইআলসিস্ট <টি> এর নিজের প্রয়োগটি স্ক্র্যাচ থেকে লিখেন (বা অন্তত উত্তরাধিকার সূত্রে <T> উত্তরাধিকার ছাড়াই)
পিপিসি

14
public void Foo(IList<Bar> list)
{
     // Do Something with the list here.
}

এই ক্ষেত্রে আপনি যে কোনও ক্লাসে পাস করতে পারেন যা IList <বার> ইন্টারফেস প্রয়োগ করে। আপনি যদি এর পরিবর্তে তালিকা <বার> ব্যবহার করেন তবে কেবল একটি তালিকা <বার> উদাহরণটি প্রবেশ করতে পারে।

তালিকাটি <বার> উপায়ের চেয়ে আইলিস্ট <বার> উপায়টি আলগাভাবে মিশ্রিত।


13

IList প্রশ্নগুলির (বা উত্তর) এর তুলনায় এই তালিকার কোনওটিই স্বাক্ষরের পার্থক্যের কথা উল্লেখ করে ris (আমি এই প্রশ্নটি কেন এসও তে অনুসন্ধান করেছি!)

সুতরাং লিস্টে অন্তর্ভুক্ত থাকা পদ্ধতিগুলি যা আইলিস্টে পাওয়া যায় না, কমপক্ষে নেট নেট হিসাবে 4.5.৪ (প্রায় 2015)

  • AddRange
  • AsReadOnly
  • BinarySearch
  • ধারণক্ষমতা
  • ConvertAll
  • বিদ্যমান
  • অনুসন্ধান
  • findall
  • FindIndex
  • FindLast
  • FindLastIndex
  • প্রতিটির জন্য, প্রত্যেকটির জন্য
  • GetRange
  • InsertRange
  • LastIndexOf
  • সব মুছে ফেলুন
  • RemoveRange
  • বিপরীত
  • সাজান
  • ToArray
  • TrimExcess
  • TrueForAll

1
সম্পূর্ণ সত্য নয়। Reverseএবং ToArrayআইইনুমেবল <T> ইন্টারফেসের জন্য এক্সটেনশন পদ্ধতি হ'ল IList <T> থেকে প্রাপ্ত।
তারেক

কারণ এটি কেবলমাত্র এসগুলিতে উপলব্ধি করে এবং Listএর অন্যান্য বাস্তবায়ন নয় IList
হ্যাঙ্ককা

12

বাস্তবায়নের উপর ইন্টারফেস ব্যবহারের জন্য সবচেয়ে গুরুত্বপূর্ণ ক্ষেত্রেটি হল আপনার এপিআই-র পরামিতি। যদি আপনার এপিআই একটি তালিকা পরামিতি নেয়, তবে যে কেউ এটি ব্যবহার করে তাকে তালিকা ব্যবহার করতে হবে। যদি প্যারামিটারের প্রকারটি IList হয় তবে কলারের আরও অনেক বেশি স্বাধীনতা রয়েছে এবং আপনি কখনও কখনও ক্লাস করেনি এমন ক্লাসগুলি ব্যবহার করতে পারেন যা আপনার কোডটি লেখার সময় উপস্থিত ছিল না।


7

NET 5.0 এর পরিবর্তে কী System.Collections.Generic.List<T>হয় System.Collection.Generics.LinearList<T>। .NET সর্বদা নামের মালিক List<T>তবে তারা গ্যারান্টি দেয় এটি IList<T>একটি চুক্তি। সুতরাং আইএমএইচও আমরা (ন্যূনতম আমি) কারও নাম ব্যবহার করার কথা নেই (যদিও এটি এই ক্ষেত্রে নেট) এবং পরে সমস্যায় পড়ি।

ব্যবহারের ক্ষেত্রে IList<T>, কলার সর্বদা কাজ করার জন্য গ্যারান্টেড জিনিস থাকে এবং প্রয়োগকারী কোনও বিকল্প কংক্রিট বাস্তবায়নের অন্তর্নিহিত সংগ্রহটি পরিবর্তন করতে মুক্ত isIList


7

সমস্ত ধারণাগুলি মূলত উপরের উত্তরগুলির বেশিরভাগ ক্ষেত্রে কেন কংক্রিট বাস্তবায়নের ক্ষেত্রে ইন্টারফেস ব্যবহার করে সে সম্পর্কে বলা আছে।

IList<T> defines those methods (not including extension methods)

IList<T> এমএসডিএন লিঙ্ক

  1. যোগ
  2. পরিষ্কার
  3. রয়েছে
  4. নকল করা
  5. GetEnumerator
  6. সূচিপত্র
  7. সন্নিবেশ
  8. অপসারণ
  9. RemoveAt

List<T> এই নয়টি পদ্ধতি প্রয়োগ করে (এক্সটেনশন পদ্ধতিগুলি সহ নয়) এর উপরে এটি প্রায় 41 টি পাবলিক পদ্ধতি রয়েছে যা আপনার অ্যাপ্লিকেশনটিতে কোনটি ব্যবহার করবেন সে সম্পর্কে আপনার বিবেচনায় ওজন রয়েছে।

List<T> এমএসডিএন লিঙ্ক


4

আপনি কারণ হতে পারে যে কোনও আইলিস্ট বা আইকোলিকেশন সংজ্ঞায়িত করা আপনার ইন্টারফেসের অন্যান্য প্রয়োগের জন্য উন্মুক্ত হবে।

আপনার কাছে একটি আইওর্ডার রিপোসিটোরি থাকতে পারে যা আইলিস্ট বা আইকোলিকেশন দুটিতে অর্ডার সংকলনকে সংজ্ঞায়িত করে। আপনার আইলিস্ট বা আইকোলিকেশন দ্বারা সংজ্ঞায়িত "বিধি" মেনে চলার পরেও অর্ডারগুলির একটি তালিকা সরবরাহ করার জন্য আপনার কাছে বিভিন্ন ধরণের বাস্তবায়ন থাকতে পারে।


3

অন্যান্য পোস্টারের পরামর্শ অনুযায়ী আইএললিস্ট <> প্রায় সবসময়ই পছন্দনীয়, তবে মনে রাখবেন যে ডাব্লুসিএফ ডেটা কন্ট্রাক্টরিশায়ালাইজারের সাথে সিরিয়ালীকরণ / ডিসরিয়ালাইজেশন একাধিক চক্রের মাধ্যমে < .NET 3.5 এসপি 1 এ একটি বাগ রয়েছে

এই বাগটি ঠিক করার জন্য এখন একটি এসপি রয়েছে: কেবি 971030 30


2

ইন্টারফেসটি নিশ্চিত করে যে আপনি অন্ততপক্ষে যে পদ্ধতিগুলি প্রত্যাশা করছেন তা পাবেন ; ইন্টারফেসের সংজ্ঞা সম্পর্কে সচেতন হওয়া। ইন্টারফেস উত্তরাধিকার সূত্রে প্রাপ্ত কোনও শ্রেণীর দ্বারা প্রয়োগ করা সমস্ত বিমূর্ত পদ্ধতি। সুতরাং কেউ যদি ইন্টারফেস থেকে কিছু সংযোজন কার্যকারিতার জন্য উত্তরাধিকার সূত্রে ব্যতীত তার নিজস্ব একটি বিশাল শ্রেণি তৈরি করে এবং সেগুলি আপনার কোনও কাজে আসে না, তবে একটি সাবক্লাসের রেফারেন্স ব্যবহার করা ভাল (এই ক্ষেত্রে ক্ষেত্রে ইন্টারফেস) এবং এটিতে কংক্রিট শ্রেণীর অবজেক্ট বরাদ্দ করুন।

অতিরিক্ত সুবিধা হ'ল আপনার কোডটি কংক্রিট শ্রেণীর যে কোনও পরিবর্তন থেকে নিরাপদ কারণ আপনি কেবলমাত্র কংক্রিট শ্রেণির কয়েকটি পদ্ধতির সাবস্ক্রাইব করছেন এবং সেগুলি হ'ল যতক্ষণ পর্যন্ত আপনি যে ইন্টারফেসটি থেকে কংক্রিট বর্গের উত্তরাধিকার সূত্রে প্রবেশ করবে ব্যবহার. সুতরাং আপনার সুরক্ষার জন্য এবং কোডারকে স্বাধীনতার জন্য যারা কংক্রিটের ক্লাসে আরও কার্যকারিতা পরিবর্তন করতে বা আরও কার্যকারিতা যুক্ত করতে কংক্রিট বাস্তবায়ন লিখছেন।


2

আপনি এই যুক্তিটি একাধিক কোণ থেকে বিশুদ্ধরূপে ওও পদ্ধতির সাথে দেখতে পারেন যা কোনও ইন্টারফেসের বিরুদ্ধে প্রোগ্রাম করার কথা বলে না যা বাস্তবায়ন নয়। এই চিন্তাভাবনার সাথে, আইলিস্ট ব্যবহার করা একইভাবে অধ্যক্ষটিকে অনুসরণ করে ঘুরতে এবং ইন্টারফেসগুলি ব্যবহার করে যা আপনি স্ক্র্যাচ থেকে সংজ্ঞায়িত করেন। আমি সাধারণভাবে কোনও ইন্টারফেসের মাধ্যমে সরবরাহযোগ্য পরিমাণ এবং নমনীয়তার কারণগুলিতেও বিশ্বাস করি। যদি IList <T> প্রবর্তনকারী কোনও শ্রেণীর প্রসারিত বা পরিবর্তন করা দরকার হয় তবে গ্রাহক কোডটি পরিবর্তন করতে হবে না; এটি জানে যে আইলিস্ট ইন্টারফেস চুক্তিটি কী মেনে চলে। তবে পরিবর্তিত ক্লাসে একটি কংক্রিট বাস্তবায়ন এবং তালিকা <টি> ব্যবহার করে কলিং কোডটিও পরিবর্তিত হতে পারে। কারণ IList <T> মেনে চলা কোনও শ্রেণি একটি নির্দিষ্ট আচরণের গ্যারান্টি দেয় যা তালিকার <T> ব্যবহার করে কংক্রিটের ধরণের দ্বারা গ্যারান্টিযুক্ত নয়।

তালিকায় <টি> ডিফল্ট বাস্তবায়ন পরিবর্তন ভালো কিছু করার শক্তি না থাকার একটি বর্গ বাস্তবায়নকারী IList উপর <টি> বলতে .Add, .remove বা অন্য কোন IList পদ্ধতি ডেভেলপার একটি দেয় অনেক নমনীয়তা ও ক্ষমতার, অন্যথায় পূর্বনির্ধারিত তালিকা অনুসারে <টি>


0

সাধারণত, আপনার জনসাধারণের মুখোমুখি এপিআইতে আইলিস্ট ব্যবহার করা (যখন উপযুক্ত, এবং তালিকা শব্দার্থবিজ্ঞানের প্রয়োজন হয়), এবং তারপরে এপিআই বাস্তবায়নের জন্য অভ্যন্তরীণভাবে তালিকাভুক্ত করা একটি ভাল পন্থা। এটি আপনাকে ক্লাস ব্যবহার করে এমন কোড না ভেঙে আইলিস্টের ভিন্ন প্রয়োগে পরিবর্তিত হতে দেয়।

ক্লাসের নাম তালিকার পরবর্তী। নেট ফ্রেমওয়ার্কে পরিবর্তন করা যেতে পারে তবে ইন্টারফেসটি চুক্তি হওয়ায় ইন্টারফেসটি কখনই পরিবর্তন হতে পারে না।

মনে রাখবেন যে, যদি আপনার এপিআইটি কেবল ফোরচ লুপ ইত্যাদিতে ব্যবহার করা হয় তবে আপনি তার পরিবর্তে কেবলমাত্র আইনিউমারেবল প্রকাশের বিষয়টি বিবেচনা করতে পারেন।

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