ইন্টারফেস প্রয়োগের জন্য স্ট্রাক্টের পক্ষে এটি নিরাপদ?


94

আমি সি # এর মাধ্যমে সিএলআর-তে ইন্টারফেস প্রয়োগ করা স্ট্রাইকগুলির পক্ষে কীভাবে খারাপ তা সম্পর্কে কিছু পড়ার কথা মনে হচ্ছে তবে আমি এ সম্পর্কে কিছুই খুঁজে পাচ্ছি না। এটা কি খারাপ? এটি করার কোনও অনিচ্ছাকৃত পরিণতি আছে কি?

public interface Foo { Bar GetBar(); }
public struct Fubar : Foo { public Bar GetBar() { return new Bar(); } }

উত্তর:


45

এই প্রশ্নে বেশ কয়েকটি জিনিস চলছে ...

কোনও কাঠামোর পক্ষে কোনও ইন্টারফেস প্রয়োগ করা সম্ভব, তবে concernsালাই, পরিবর্তন এবং কার্য সম্পাদন নিয়ে উদ্বেগ রয়েছে। আরও বিশদের জন্য এই পোস্টটি দেখুন: https://docs.microsoft.com/en-us/archive/blogs/abhinaba/c-structs-and-interface

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


4
"বক্সিংয়ের ফলস্বরূপ, কাঠামোর অভ্যন্তরীণ অবস্থার পরিবর্তনকারী অপারেশনগুলি সঠিকভাবে আচরণ করতে পারে না।" একটি উদাহরণ দিন এবং উত্তর পান।

4
@ উইল: আপনার মন্তব্যে আপনি কী উল্লেখ করছেন তা নিশ্চিত নয়। আমি উল্লেখ করা ব্লগ পোস্টটির একটি উদাহরণ রয়েছে যা দেখায় যে স্ট্রাক্টটিতে একটি ইন্টারফেস পদ্ধতি কল করা আসলে অভ্যন্তরীণ মান পরিবর্তন করে না।
স্কট ডোরম্যান

12
@ স্কটডোরম্যান: কিছু ক্ষেত্রে স্ট্রাকচার প্রয়োগ ইন্টারফেস প্রয়োগ করা বক্সিং এড়াতে সহায়তা করতে পারে । প্রধান উদাহরণগুলি হ'ল IComparable<T>এবং IEquatable<T>Fooবিভিন্ন ধরণের ভেরিয়েবলে স্ট্রাক্ট সংরক্ষণের IComparable<Foo>জন্য বক্সিং প্রয়োজন, তবে জেনেরিক টাইপটি Tযদি IComparable<T>একজনকে সীমাবদ্ধ করা Tহয় তবে তা একটির বাক্স না রেখে অন্যটির সাথে তুলনা করতে পারে , এবং এটি Tসীমাবদ্ধতা প্রয়োগ করে than এই ধরনের সুবিধাজনক আচরণ কেবলমাত্র ইন্টারফেস প্রয়োগ করার ক্ষমতা স্ট্রাক্ট দ্বারা সম্ভব। এটি বলা হয়ে গেছে ...
সুপারক্যাট

4
... এটি যদি এমন ঘোষণা করার কোনও উপায় থাকে যে নির্দিষ্ট ইন্টারফেসটি কেবল আনবক্সড স্ট্রাকচারের জন্যই প্রযোজ্য বলে বিবেচনা করা উচিত, তবে এটি এমন কিছু প্রসঙ্গ আছে যেখানে শ্রেণি অবজেক্ট বা বক্সযুক্ত কাঠামোর পক্ষে কাঙ্ক্ষিত থাকা সম্ভব হবে না it আচরণ।
সুপারক্যাট

4
"স্ট্রাক্টগুলি অবজেক্টের জন্য ব্যবহার করা উচিত যাদের মান-ধরণের শব্দার্থক শব্দ রয়েছে ... স্ট্রাক্টের অভ্যন্তরীণ অবস্থার পরিবর্তনকারী ক্রিয়াকলাপগুলি সঠিকভাবে আচরণ করতে পারে না।" ভ্যালু-টাইপ শব্দার্থকতা এবং পরিবর্তনীয়তা ভালভাবে মেশে না এমন ঘটনাটি কি আসল সমস্যা নয়?
jpmc26

185

যেহেতু অন্য কেউ সুস্পষ্টভাবে এই উত্তরটি সরবরাহ করেনি আমি নিম্নলিখিতগুলি যুক্ত করব:

স্ট্রাক্টটিতে একটি ইন্টারফেস প্রয়োগের কোনও নেতিবাচক ফলাফল নেই।

স্ট্রাকটি ধারণ করতে ব্যবহৃত ইন্টারফেস ধরণের যে কোনও ভেরিয়েবলের ফলে সেই কাঠামোর একটি বক্সযুক্ত মান ব্যবহৃত হবে। যদি স্ট্রাক্টটি পরিবর্তনযোগ্য (একটি ভাল জিনিস) হয় তবে আপনি না হলে এটি সবচেয়ে খারাপ পারফরম্যান্সের সমস্যা:

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

এটি উভয়ই অসম্ভব হবে, পরিবর্তে আপনি নিম্নলিখিতগুলির মধ্যে একটি করছেন সম্ভবত:

জেনারিক্স

স্ট্রাক্ট বাস্তবায়ন ইন্টারফেসের জন্য অনেক যুক্তিসঙ্গত কারণগুলি যাতে এগুলি সীমাবদ্ধতার সাথে জেনেরিক প্রসঙ্গে ব্যবহার করা যায় । এই ফ্যাশনে যখন ভেরিয়েবলটি এর মতো ব্যবহৃত হয়:

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);
    }
}
  1. প্রকারের প্যারামিটার হিসাবে কাঠামোর ব্যবহার সক্ষম করুন
    • এতক্ষণ আর কোনও বাধা যেমন ব্যবহার করা হয় না new()বা classব্যবহার করা হয় না।
  2. এইভাবে ব্যবহৃত স্ট্রাইকগুলিতে বক্সিং এড়ানোর অনুমতি দিন।

তারপরে এটি.এ কোনও ইন্টারফেস রেফারেন্স নয় সুতরাং এটি এতে যা কিছু আছে তার একটি বাক্স তৈরি করে না। আরও যখন 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)
    ;//no-op

তালিকার মাধ্যমে ফিরে আসা গণক একটি কাঠামো, তালিকাটি গণনার সময় বরাদ্দ এড়াতে একটি অনুকূলকরণ (কিছু আকর্ষণীয় পরিণতি সহ )। তবে পূর্বাংশের শব্দার্থবিজ্ঞানগুলি নির্দিষ্ট করে যে যদি পুনরাবৃত্তি সম্পন্ন হয় 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: ডাবল এবং ফ্লোট এই নিয়মের ব্যতিক্রম যেখানে ন্যান মানগুলি সমান হিসাবে বিবেচিত হয় না।


4
উদাহরণস্বরূপ সাইটটি সরানো হয়েছে তবে এর বিষয়বস্তু বজায় রেখে কোনও ভাল কাজ করেনি। আমি চেষ্টা করেছিলাম, তবে ওপি এর জ্ঞানের অভাবে ডিম্বাড্ডকাএফ.সফটওয়্যার / এস্পনেট / 70১70০৩৩৯২ / এর মূল দলিলটি খুঁজে পাই না । (পিএস +1 একটি দুর্দান্ত সারাংশের জন্য)।
আবেল

4
এটি দুর্দান্ত উত্তর, তবে আমি মনে করি আপনি "সংক্ষিপ্তসার "টিকে" টিএল; ডিআর "হিসাবে শীর্ষে নিয়ে গিয়ে এটিকে উন্নতি করতে পারেন। উপসংহারটি সরবরাহ করা প্রথমে পাঠককে জানতে সাহায্য করে আপনি কোথায় জিনিস নিয়ে যাচ্ছেন।
হান্স

একটিতে কাস্ট structকরার সময় সংকলক সতর্কতা থাকা উচিত interface
জালাল

8

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

উদাহরণস্বরূপ, যদি কারও কাছে একটি পদ্ধতি থাকে তবে এই CompareTwoThings<T>(T thing1, T thing2) where T:IComparable<T>জাতীয় পদ্ধতিটি thing1.Compare(thing2)বক্স না করে thing1বা কল করে কল করতে পারে thing2। যদি হয়ে thing1থাকে, যেমন, একটি Int32, রান-টাইমটি জানতে পারে যে এটি কখন কোড তৈরি করে CompareTwoThings<Int32>(Int32 thing1, Int32 thing2)। যেহেতু এটি পদ্ধতিটি হোস্টিংয়ের জিনিস এবং প্যারামিটার হিসাবে যে জিনিসটি পাস হচ্ছে তা উভয়েরই সঠিক ধরণটি জানতে পারবে, সুতরাং সেগুলির কোনওটিই বাক্সে লাগবে না।

ইন্টারফেস প্রয়োগকারী স্ট্রাক্টগুলির সাথে সবচেয়ে বড় সমস্যাটি হ'ল একটি স্ট্রাক্ট যা ইন্টারফেসের ধরণের একটি স্থানে সঞ্চয় হয় Object, বা ValueType(তার নিজস্ব ধরণের অবস্থানের বিপরীতে) শ্রেণি অবজেক্ট হিসাবে আচরণ করবে। কেবল পঠন ইন্টারফেসের জন্য এটি সাধারণত সমস্যা হয় না তবে পরিবর্তিত ইন্টারফেসের জন্য IEnumerator<T>এটি কিছু অদ্ভুত শব্দার্থার্থ পেতে পারে।

উদাহরণস্বরূপ, নিম্নলিখিত কোডটি বিবেচনা করুন:

List<String> myList = [list containing a bunch of strings]
var enumerator1 = myList.GetEnumerator();  // Struct of type List<String>.IEnumerator
enumerator1.MoveNext(); // 1
var enumerator2 = enumerator1;
enumerator2.MoveNext(); // 2
IEnumerator<string> enumerator3 = enumerator2;
enumerator3.MoveNext(); // 3
IEnumerator<string> enumerator4 = enumerator3;
enumerator4.MoveNext(); // 4

চিহ্নিত করা বিবৃতি # 1 enumerator1প্রথম উপাদানটি পড়ার জন্য প্রধান হবে । সেই গণকের রাজ্যে অনুলিপি করা হবে enumerator2। চিহ্নিত 2 টি বিবৃতি দ্বিতীয় উপাদানটি পড়ার জন্য সেই অনুলিপিটিকে অগ্রসর করবে, কিন্তু প্রভাব ফেলবে না enumerator1। এরপরে দ্বিতীয় গণকের রাষ্ট্রটি অনুলিপি করা enumerator3হবে, যা চিহ্নিত বিবৃতি # 3 দ্বারা উন্নত হবে। এর পরে, কারণ enumerator3এবং enumerator4উভয় রেফারেন্স ধরনের, একটি হয় REFERENCE, করতে enumerator3তারপর অনুলিপি করা হবে enumerator4, তাই হিসাবে চিহ্নিত বিবৃতি কার্যকরভাবে এগিয়ে যাবে উভয় enumerator3 এবং enumerator4

কিছু লোক ভান করার চেষ্টা করে যে মান ধরণের এবং রেফারেন্সের ধরণ উভয় প্রকারের Object, তবে এটি সত্য নয়। আসল মান ধরণের রূপান্তরিত হয় Object, তবে এটির উদাহরণ নয়। List<String>.Enumeratorযার উদাহরণ that ধরণের কোনও স্থানে সংরক্ষণ করা হয় এটি একটি মান-ধরণের এবং মান ধরণের হিসাবে আচরণ করে; এটিকে কোনও প্রকারের স্থানে অনুলিপি করা হলে IEnumerator<String>এটি একটি রেফারেন্স টাইপে রূপান্তরিত করবে এবং এটি একটি রেফারেন্স ধরণের হিসাবে আচরণ করবে । পরেরটি এক প্রকারের Object, তবে পূর্বেরটি তা নয়।

বিটিডাব্লু, আরও দু'টি নোট: (1) সাধারণভাবে, পরিবর্তনীয় শ্রেণির ধরণেরগুলির Equalsপদ্ধতিগুলির রেফারেন্স রেফারেন্সের সমতা থাকতে হবে, তবে বক্সযুক্ত কাঠামোর পক্ষে এটি করার কোনও শালীন উপায় নেই; (২) এর নাম থাকা সত্ত্বেও ValueTypeএটি একটি শ্রেণির ধরণের, কোনও মান ধরণের নয়; থেকে প্রাপ্ত সমস্ত প্রকারের System.Enumমান ধরণের হয়, সমস্ত ধরণের যা ValueTypeব্যতিক্রম ছাড়া প্রাপ্ত হয় System.Enum, তবে উভয়ই ValueTypeএবং System.Enumশ্রেণীর ধরণের।


3

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

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


ইন্টারফেস প্রয়োগ করে এমন আদিমদের জন্যও কি এটি এমনভাবে কাজ করে?
এওয়েটালস

3

(ভাল যোগ করার জন্য বড় কিছুই পাই নি তবে সম্পাদনার দক্ষতা এখনও নেই তাই এখানে চলে যায় ..) নিখুঁত
নিরাপদ। স্ট্রাইকগুলিতে ইন্টারফেস প্রয়োগের সাথে অবৈধ কিছু নয়। তবে আপনি কেন এটি করতে চান তা আপনার প্রশ্ন করা উচিত।

তবে কোনও স্ট্রাক্টের ইন্টারফেসের রেফারেন্স পেতে এটি বাক্স হবে। পারফরম্যান্স পেনাল্টি এবং তাই।

আমি এখনই ভাবতে পারি এমন একমাত্র বৈধ দৃশ্যের চিত্রটি এখানে আমার পোস্টে তুলে ধরা হয়েছে । আপনি যখন কোনও সংগ্রহে সঞ্চিত স্ট্রাক্টের স্টেটটি পরিবর্তন করতে চান, আপনি স্ট্রাক্টে প্রকাশিত একটি অতিরিক্ত ইন্টারফেসের মাধ্যমে এটি করতে হবে।


যদি কেউ এমন কোনও ব্যবস্থায় পাস করে Int32যা জেনেরিক ধরণের T:IComparable<Int32>(যা পদ্ধতিটির জেনেরিক ধরণের প্যারামিটার বা পদ্ধতিটির শ্রেণি হতে পারে) গ্রহণ Compareকরে তবে সেই পদ্ধতিটি বাক্সবন্দি না করে পাস-ইন অবজেক্টে পদ্ধতিটি ব্যবহার করতে সক্ষম হবে।
সুপারক্যাট

1

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

এই লিঙ্কটি এর সাথে অন্যান্য সমস্যা থাকতে পারে বলে পরামর্শ দেয় ...

http://blogs.msdn.com/abhinaba/archive/2005/10/05/477238.aspx


0

ইন্টারফেস প্রয়োগকারী কাঠামোর কোনও পরিণতি নেই। উদাহরণস্বরূপ অন্তর্নির্মিত সিস্টেম স্ট্রাইকগুলি IComparableএবং এর মতো ইন্টারফেস প্রয়োগ করে IFormattable


0

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

অবশ্যই আপনি যদি একই ইন্টারফেসটি প্রয়োগ করেন এমন একাধিক স্ট্রাক্ট রয়েছে, তখন এটি সামান্য কার্যকর হতে পারে তবে আমি তখন একটি বর্গ ব্যবহার এবং এটি সঠিকভাবে করার পরামর্শ দিই।

অবশ্যই, একটি ইন্টারফেস বাস্তবায়নের মাধ্যমে আপনি কাঠামোটি বক্সিং করছেন, সুতরাং এটি এখন স্তূপের উপর বসে, এবং আপনি এটি আর মান দিয়ে পাস করতে সক্ষম হবেন না ... এটি আমার মতামতকে আরও দৃfor় করে তোলে যে আপনি কেবল একটি ক্লাস ব্যবহার করা উচিত এই অবস্থায়.


আপনি কতক্ষণ কংক্রিট প্রয়োগের পরিবর্তে চারপাশে আইকাম্পারেবল পাস করেন?
ফ্লাইওয়াত

IComparableমানটি বাক্স করতে আপনাকে পাস করতে হবে না । কেবল এমন কোনও পদ্ধতির কল করে IComparableযা কোনও মান ধরণের সাথে প্রত্যাশা করে যা এটি প্রয়োগ করে আপনি স্পষ্টভাবে মান ধরণের বাক্সটি দেবেন will
অ্যান্ড্রু হার

4
@ অ্যান্ড্রুহ্যারে: সীমাবদ্ধ জেনারিকগুলি পদ্ধতি ছাড়াই বিনা বাক্সের IComparable<T>কাঠামোর জন্য আবেদন করতে দেয় T
সুপারক্যাট

-10

স্ট্রাক্টগুলি স্ট্যাকের মধ্যে থাকা ক্লাসগুলির মতো। তাদের "অনিরাপদ" হওয়ার কোনও কারণ আমি দেখছি না।


তাদের উত্তরাধিকারের অভাব ব্যতীত।
ফ্লাইওয়াত

7
এই উত্তরের প্রতিটি অংশের সাথে আমার একমত হতে হবে না; তারা না অগত্যা স্ট্যাক বাস, এবং কপি-শব্দার্থবিদ্যা হয় ভিন্ন ক্লাস।
মার্ক গ্র্যাভেল

4
এগুলি অপরিবর্তনীয়, স্ট্রাক্টের অতিরিক্ত ব্যবহার আপনার
স্মরণকে

4
@ তেমনশিপাহী ক্লাস ইনস্ট্যান্সের অতিরিক্ত ব্যবহার আপনার আবর্জনা সংগ্রহকারীকে ক্ষিপ্ত করে তুলবে।
IllidanS4 মনিকা

4
যার 20k + প্রতিনিধি রয়েছে তার পক্ষে এই উত্তরটি কেবল অগ্রহণযোগ্য।
ক্রিথিক
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.