আরও আধুনিক সমাধান
অভ্যন্তরীণ সংগ্রহটি পরিবর্তনযোগ্য হতে না হলে আপনি System.Collections.Immutableপ্যাকেজটি ব্যবহার করতে পারবেন , আপনার ক্ষেত্রের প্রকারকে অপরিবর্তনীয় সংগ্রহ হিসাবে পরিবর্তন করতে পারবেন এবং তারপরে সরাসরি এটি প্রকাশ করতে পারেন - Fooঅবশ্যই ধরে নিবেন যে নিজেকে অবশ্যই পরিবর্তনযোগ্য।
প্রশ্নটি আরও সরাসরি সমাধানের জন্য আপডেট করা উত্তর
কলিং কোডটি যদি সংগ্রহের উপরে কেবল পুনরাবৃত্তি করে তবে কোনও আইনিউবারেবলের চেয়ে কেবলমাত্র পঠনকলি সংগ্রহ হিসাবে অভ্যন্তরীণ সংগ্রহকে প্রকাশ করার কোনও কারণ আছে?
এটি নির্ভর করে আপনি কলিং কোডটিতে কতটা বিশ্বাস করেন। আপনি যদি এই সদস্যকে কখনও কল করবেন এমন সমস্ত কিছুর উপর যদি আপনি সম্পূর্ণ নিয়ন্ত্রণে থাকেন এবং আপনি গ্যারান্টি দেন যে কোনও কোড কখনও ব্যবহার করবে না:
ICollection<Foo> evil = (ICollection<Foo>) bar.Foos;
evil.Add(...);
তবে নিশ্চিত, আপনি যদি সরাসরি সংগ্রহটি ফিরিয়ে দেন তবে কোনও ক্ষতি করা হবে না। আমি যদিও এর চেয়ে কিছুটা বেশি বেহাল হতে চেষ্টা করি।
তেমনি, আপনি যেমন বলেছেন: আপনার যদি কেবল প্রয়োজন হয় IEnumerable<T> , তবে কেন নিজেকে আরও শক্তিশালী কিছুতে বেঁধে রাখুন?
আসল উত্তর
আপনি .NET 3.5 ব্যবহার করছেন, আপনি একটি অনুলিপি তৈরি এড়াতে পারবেন এবং এড়াতে সরল কল ব্যবহার করে সাধারণ কাস্ট এড়াতে পারেন:
public IEnumerable<Foo> Foos {
get { return foos.Skip(0); }
}
(তুচ্ছভাবে মোড়ানোর জন্য প্রচুর অন্যান্য বিকল্প রয়েছে - Skipসিলেক্ট / ওভার ওভার সম্পর্কে দুর্দান্ত জিনিসটি প্রতিটি পুনরাবৃত্তির জন্য নিরর্থকভাবে কার্যকর করার কোনও প্রতিনিধি নেই))
আপনি যদি .NET 3.5 ব্যবহার না করে থাকেন তবে একই জিনিসটি করতে আপনি খুব সাধারণ একটি র্যাপার লিখতে পারেন:
public static IEnumerable<T> Wrapper<T>(IEnumerable<T> source)
{
foreach (T element in source)
{
yield return element;
}
}
ReadOnlyCollectionযদি অদ্ভুত হন তবে আপনি ফেরত সংগ্রহটি মুড়ে রাখতে চাইবেন তবে এখন আপনি একটি নির্দিষ্ট প্রয়োগের সাথে আবদ্ধ নন।