আমি জানি, আমি জানি ... এ জাতীয় প্রশ্নের উত্তর এরিক লিপার্টের উত্তর সাধারণত "" কারণ এটি ডিজাইনিং, বাস্তবায়ন, পরীক্ষা এবং ডকুমেন্টিংয়ের ব্যয়বহুল ছিল না "।
তবে তবুও, আমি আরও ভাল ব্যাখ্যা চাই ... আমি নতুন ব্লগ # 4 নতুন বৈশিষ্ট্যগুলি সম্পর্কে এই ব্লগ পোস্টটি পড়ছিলাম এবং সিওএম ইন্টারপ সম্পর্কে বিভাগে, নীচের অংশটি আমার দৃষ্টি আকর্ষণ করেছে:
যাইহোক, এই কোডটি আরও একটি নতুন বৈশিষ্ট্য ব্যবহার করে: সূচিযুক্ত বৈশিষ্ট্য (সীমার পরে square বর্গাকার বন্ধনীগুলির দিকে ঘনিষ্ঠভাবে নজর দিন)) তবে এই বৈশিষ্ট্যটি কেবল সিওএম ইন্টারপের জন্য উপলভ্য; আপনি সি # 4.0 এ আপনার নিজস্ব ইনডেক্স বৈশিষ্ট্য তৈরি করতে পারবেন না ।
ঠিক আছে কিন্তু কেন ? আমি ইতিমধ্যে জানতাম এবং আফসোস করেছি যে সি # তে সূচিযুক্ত বৈশিষ্ট্য তৈরি করা সম্ভব ছিল না, তবে এই বাক্যটি আমাকে এ সম্পর্কে আবার ভাবতে বাধ্য করে। আমি এটি বাস্তবায়নের বেশ কয়েকটি ভাল কারণ দেখতে পাচ্ছি:
- সিএলআর এটি সমর্থন করে (উদাহরণস্বরূপ,
PropertyInfo.GetValue
একটিindex
প্যারামিটার রয়েছে), সুতরাং এটি দুঃখের বিষয় আমরা সি # তে এর সুবিধা নিতে পারি না - এটি COM ইন্টারপ জন্য সমর্থিত, যেমন নিবন্ধে প্রদর্শিত হয়েছে (গতিশীল প্রেরণ ব্যবহার করে)
- এটি VB.NET এ প্রয়োগ করা হয়েছে
- ইন্ডেক্সার তৈরি করা ইতোমধ্যে সম্ভব, অর্থাত্ বস্তুতে নিজেই একটি সূচক প্রয়োগ করা, সুতরাং একই বৈশিষ্ট্যটি রেখে এবং কেবলমাত্র
this
নামের নামের পরিবর্তে বৈশিষ্ট্যগুলিতে ধারণা প্রসারিত করা কোনও বড় বিষয় হবে না
এটি এ জাতীয় জিনিস লিখতে দেয়:
public class Foo
{
private string[] _values = new string[3];
public string Values[int index]
{
get { return _values[index]; }
set { _values[index] = value; }
}
}
বর্তমানে আমি জানি যে একমাত্র কার্যতালিকা হ'ল একটি অভ্যন্তর শ্রেণি তৈরি করা ( ValuesCollection
উদাহরণস্বরূপ) যা কোনও সূচক প্রয়োগ করে এবং Values
সম্পত্তি পরিবর্তন করে যাতে এটি সেই অভ্যন্তর শ্রেণীর উদাহরণ দেয় returns
এটি করা খুব সহজ, তবে বিরক্তিকর ... সুতরাং সম্ভবত সংকলকটি এটি আমাদের জন্য করতে পারে! একটি বিকল্প হ'ল একটি অভ্যন্তরীণ শ্রেণি তৈরি করা যা সূচকটি কার্যকর করে এবং একটি পাবলিক জেনেরিক ইন্টারফেসের মাধ্যমে প্রকাশ করে:
// interface defined in the namespace System
public interface IIndexer<TIndex, TValue>
{
TValue this[TIndex index] { get; set; }
}
public class Foo
{
private string[] _values = new string[3];
private class <>c__DisplayClass1 : IIndexer<int, string>
{
private Foo _foo;
public <>c__DisplayClass1(Foo foo)
{
_foo = foo;
}
public string this[int index]
{
get { return _foo._values[index]; }
set { _foo._values[index] = value; }
}
}
private IIndexer<int, string> <>f__valuesIndexer;
public IIndexer<int, string> Values
{
get
{
if (<>f__valuesIndexer == null)
<>f__valuesIndexer = new <>c__DisplayClass1(this);
return <>f__valuesIndexer;
}
}
}
তবে অবশ্যই, সেই ক্ষেত্রে সম্পত্তিটি আসলে ফিরে আসবেIIndexer<int, string>
, এবং সত্যিকার অর্থেই কোনও সূচকযুক্ত সম্পত্তি হবে না ... আসল সিএলআর সূচিকৃত সম্পত্তি উত্পন্ন করা ভাল be
আপনি কি মনে করেন ? আপনি কি এই বৈশিষ্ট্যটি সি # তে দেখতে চান? তা না হলে কেন?