যেহেতু অন্য কেউ সুস্পষ্টভাবে এই উত্তরটি সরবরাহ করেনি আমি নিম্নলিখিতগুলি যুক্ত করব:
স্ট্রাক্টটিতে একটি ইন্টারফেস প্রয়োগের কোনও নেতিবাচক ফলাফল নেই।
স্ট্রাকটি ধারণ করতে ব্যবহৃত ইন্টারফেস ধরণের যে কোনও ভেরিয়েবলের ফলে সেই কাঠামোর একটি বক্সযুক্ত মান ব্যবহৃত হবে। যদি স্ট্রাক্টটি পরিবর্তনযোগ্য (একটি ভাল জিনিস) হয় তবে আপনি না হলে এটি সবচেয়ে খারাপ পারফরম্যান্সের সমস্যা:
- লকিংয়ের উদ্দেশ্যে ফলাফলটি অবজেক্টটি ব্যবহার করা (কোনওভাবেই অত্যন্ত খারাপ ধারণা)
- রেফারেন্স ইক্যুয়ালিটি সিম্যানটিক্স ব্যবহার করে এবং একই স্ট্রাক্ট থেকে এটি দুটি বক্সের মানগুলির জন্য কাজ করার প্রত্যাশা করে।
এটি উভয়ই অসম্ভব হবে, পরিবর্তে আপনি নিম্নলিখিতগুলির মধ্যে একটি করছেন সম্ভবত:
জেনারিক্স
স্ট্রাক্ট বাস্তবায়ন ইন্টারফেসের জন্য অনেক যুক্তিসঙ্গত কারণগুলি যাতে এগুলি সীমাবদ্ধতার সাথে জেনেরিক প্রসঙ্গে ব্যবহার করা যায় । এই ফ্যাশনে যখন ভেরিয়েবলটি এর মতো ব্যবহৃত হয়:
class Foo<T> : IEquatable<Foo<T>> where T : IEquatable<T>
{
private readonly T a;
public bool Equals(Foo<T> other)
{
return this.a.Equals(other.a);
}
}
- প্রকারের প্যারামিটার হিসাবে কাঠামোর ব্যবহার সক্ষম করুন
- এতক্ষণ আর কোনও বাধা যেমন ব্যবহার করা হয় না
new()
বা class
ব্যবহার করা হয় না।
- এইভাবে ব্যবহৃত স্ট্রাইকগুলিতে বক্সিং এড়ানোর অনুমতি দিন।
তারপরে এটি.এ কোনও ইন্টারফেস রেফারেন্স নয় সুতরাং এটি এতে যা কিছু আছে তার একটি বাক্স তৈরি করে না। আরও যখন C # কম্পাইলার জেনেরিক ক্লাস এবং চাহিদা প্রকার প্যারামিটার টি এটি ব্যবহার করতে পারেন দৃষ্টান্ত সংজ্ঞাসমূহ উদাহরণস্বরূপ পদ্ধতি আমন্ত্রণ সন্নিবেশ করতে প্রনয়ন সবাধ opcode:
যদি এই টাইপটি কোনও মান প্রকার এবং এই টাইপটি প্রয়োগ করে পদ্ধতিটি করে থাকে তবে পিটিআরটি এই টাইপ দ্বারা পদ্ধতিটি প্রয়োগের জন্য কল পদ্ধতিতে নির্দেশক হিসাবে 'এই' পয়েন্টার হিসাবে অবিস্মরণিত পাস করা হয়।
এটি বক্সিং এড়ায় এবং যেহেতু মান ধরণের ইন্টারফেস বাস্তবায়ন করা হয় অবশ্যই পদ্ধতিটি প্রয়োগ করা উচিত , সুতরাং কোনও বক্সিং ঘটবে না। উপরের উদাহরণে Equals()
আবাহন this.a কোন বক্স সঙ্গে সম্পন্ন করা হয় 1 ।
কম ঘর্ষণ এপিআই
বেশিরভাগ স্ট্রাক্টে আদিম-মত শব্দার্থক থাকতে হবে যেখানে বিটওয়াইজ অভিন্ন মানগুলি 2 সমান বলে বিবেচিত হয় । রানটাইম অন্তর্নিহিত ক্ষেত্রে Equals()
এই জাতীয় আচরণ সরবরাহ করবে তবে এটি ধীর হতে পারে। এছাড়াও এই অন্তর্নিহিত সাম্যতাটি বাস্তবায়নের হিসাবে প্রকাশিত হয় নাIEquatable<T>
এবং ডিক্টরিজগুলির কী হিসাবে সহজেই ব্যবহৃত স্ট্রাইকগুলি স্পষ্টভাবে তারা এগুলি প্রয়োগ না করে বাধা দেয়। তাই অনেকগুলি সার্বজনীন কাঠামোর ধরণের ক্ষেত্রে তারা বাস্তবায়িত করে IEquatable<T>
(কোথায়) তা ঘোষণা করা সাধারণT
সিএলআর বিসিএল-র মধ্যে বিদ্যমান বিদ্যমান মান ধরণের আচরণের সাথে সামঞ্জস্য রেখে এই সহজ এবং আরও ভাল পারফরম্যান্সের পাশাপাশি তাদের রয়েছে)
ছাত্রলীগের সমস্ত আদিমরা ন্যূনতমভাবে প্রয়োগ করে:
IComparable
IConvertible
IComparable<T>
IEquatable<T>
(এবং এইভাবে IEquatable
)
অনেকে বাস্তবায়নও করেন IFormattable
, ডেটটাইম, টাইমস্প্যান এবং গাইডের মতো সিস্টেম সংজ্ঞায়িত মান ধরণের অনেকগুলিও এগুলি বা তাদের সমস্ত প্রয়োগ করে। আপনি যদি জটিল সংখ্যার কাঠামো বা কিছু নির্দিষ্ট প্রস্থের পাঠ্য মানগুলির মতো একইভাবে 'ব্যাপকভাবে কার্যকর' প্রকারটি বাস্তবায়ন করে থাকেন তবে এর মধ্যে অনেকগুলি সাধারণ ইন্টারফেস প্রয়োগ করা (সঠিকভাবে) আপনার কাঠামোটিকে আরও কার্যকর এবং ব্যবহারযোগ্য করে তুলবে able
ব্যতিক্রম
স্পষ্টতই যদি ইন্টারফেসটি দৃ mut়ভাবে পরিবর্তনকে (যেমন ICollection
) বোঝায় তবে এটি বাস্তবায়ন করা একটি খারাপ ধারণা কারণ এটির অর্থ আপনি কাঠামোটিকে পরিবর্তনযোগ্য করে তুলেছেন (ইতিমধ্যে বর্ণিত ত্রুটিগুলির দিকে পরিচালিত করে যেখানে পরিবর্তনগুলি মূলের পরিবর্তে বাক্সযুক্ত মানের উপর ঘটে থাকে) ) বা আপনি যেমন Add()
ব্যতিক্রমগুলি ছুঁড়ে ফেলা বা নিক্ষিপ্ত পদ্ধতিগুলির প্রভাবগুলিকে উপেক্ষা করে ব্যবহারকারীদের বিভ্রান্ত করেন ।
অনেক ইন্টারফেস মিউচ্যালিটি বোঝায় না (যেমন IFormattable
) এবং একটি সামঞ্জস্যপূর্ণ ফ্যাশনে নির্দিষ্ট কার্যকারিতাটি প্রকাশ করার অভিব্যক্তিক উপায় হিসাবে পরিবেশন করে। প্রায়শই স্ট্রাক্ট ব্যবহারকারীর এই ধরনের আচরণের জন্য কোনও বক্সিং ওভারহেডের যত্ন নেবে না।
সারসংক্ষেপ
যখন অপরিবর্তনীয় মূল্যের ধরণগুলি বোধগম্যভাবে করা হয় তখন দরকারী ইন্টারফেস প্রয়োগ করা ভাল ধারণা
মন্তব্য:
1: নোট করুন যে সংযোজকটি এটি ব্যবহার করতে পারে যখন ভেরিয়েবলগুলিতে ভার্চুয়াল পদ্ধতিগুলি সুনির্দিষ্ট স্ট্রাক্ট ধরণের হিসাবে পরিচিত তবে এটিতে ভার্চুয়াল পদ্ধতিটি আহ্বান করা প্রয়োজন। উদাহরণ স্বরূপ:
List<int> l = new List<int>();
foreach(var x in l)
;
তালিকার মাধ্যমে ফিরে আসা গণক একটি কাঠামো, তালিকাটি গণনার সময় বরাদ্দ এড়াতে একটি অনুকূলকরণ (কিছু আকর্ষণীয় পরিণতি সহ )। তবে পূর্বাংশের শব্দার্থবিজ্ঞানগুলি নির্দিষ্ট করে যে যদি পুনরাবৃত্তি সম্পন্ন হয় IDisposable
তবে গণক প্রয়োগ করে তবে Dispose()
ডাকা হবে। স্পষ্টতই একটি বক্সযুক্ত কলের মাধ্যমে এটি ঘটলে গণকটি স্ট্রাক্ট হওয়ার কোনও উপকারকে সরিয়ে ফেলবে (আসলে এটি আরও খারাপ হবে)। সবচেয়ে খারাপ বিষয়, যদি নিষ্পত্তি কল কোনও উপায়ে তালিকাভুক্তকারীর অবস্থা পরিবর্তন করে তবে এটি বাক্সের ঘটনায় ঘটবে এবং জটিল ক্ষেত্রে অনেক সূক্ষ্ম বাগ প্রবর্তিত হতে পারে। সুতরাং এই ধরণের পরিস্থিতিতে নির্গত আইএল হ'ল:
IL_0001: newobj সিস্টেম। সংগ্রহ। জেনেরিক.লিস্ট..ক্টোর or
IL_0006: stloc.0
আইএল_0007: না
IL_0008: ldloc.0
IL_0009: কলভার্ট সিস্টেম.কলেশন.জেনারিক.লিস্ট.গেটইনিউমেটর
IL_000E: stloc.2
IL_000F: br.s IL_0019
IL_0011: ldloca.s 02
আইএল_0013: কল করুন সিস্টেম.কলেশন.জেনারিক.লিস্ট.জেট_কন্টেন্ট
IL_0018: stloc.1
আইএল_0019: ldloca.s 02
IL_001B: কল করুন সিস্টেম.কলেশন.জেনারিক.লিস্ট.মোভেক্সট
IL_0020: stloc.3
IL_0021: ldloc.3
IL_0022: brtrue.s IL_0011
IL_0024: ছেড়ে দিন। আইএল_0035
IL_0026: ldloca.s 02
আইএল_0028: বাধা আছে। সিস্টেম.কলেকশনস.জেনারিক.লিস্ট.ইউনামেটর
IL_002E: কলভার্ট সিস্টেম IDআইডিপসোসিবল D ডিসপোজ
আইএল_০০৩৩৩ না
IL_0034: শেষ পর্যন্ত
সুতরাং আইডিস্পোজেবল বাস্তবায়ন কোনও কার্যকারিতা সংক্রান্ত সমস্যা সৃষ্টি করে না এবং এনুমুলেটরটির (আফসোসযোগ্য) পার্সোনাল দিকটি সংরক্ষণ করা হয় তবে ডিসপোজ পদ্ধতিটি আসলে কিছু করা উচিত!
2: ডাবল এবং ফ্লোট এই নিয়মের ব্যতিক্রম যেখানে ন্যান মানগুলি সমান হিসাবে বিবেচিত হয় না।