একটি কাঠামো, এর অন্তরে, ক্ষেত্রগুলির সমষ্টি থেকে কিছুই বেশি বা কম নয়। .NET এ কোনও কাঠামোর পক্ষে একটি অবজেক্ট হিসাবে "ভান" করা এবং প্রতিটি কাঠামোর প্রকারের জন্য এটি সম্ভব। । একটি ভেরিয়েবল যা এই জাতীয় হিপ অবজেক্টের ("বক্সযুক্ত" কাঠামো) রেফারেন্স ধারণ করে তা রেফারেন্স শব্দার্থক চিহ্ন প্রদর্শন করবে, তবে একটি স্ট্রাক্ট সরাসরি ধারণ করে এমনটি কেবল ভেরিয়েবলের সমষ্টি।
আমি মনে করি স্ট্রাক্ট-বনাম-শ্রেণির বিভ্রান্তির বেশিরভাগ কারণ এই যে স্ট্রাকচারগুলির দুটি খুব ব্যবহারের ক্ষেত্রে রয়েছে, যার নকশার দিকনির্দেশগুলি খুব আলাদা হওয়া উচিত, তবে এমএস নির্দেশিকা তাদের মধ্যে পার্থক্য করে না ish কখনও কখনও এমন কিছুর প্রয়োজন হয় যা বস্তুর মতো আচরণ করে; সেক্ষেত্রে এমএসের নির্দেশিকা বেশ যুক্তিসঙ্গত, যদিও "16 বাইট সীমা" সম্ভবত 24-22 এর মতো হওয়া উচিত। কখনও কখনও, যাইহোক, যা প্রয়োজন তা হল ভেরিয়েবলগুলির সমষ্টি। এই উদ্দেশ্যে ব্যবহৃত স্ট্রাক্টটিতে কেবলমাত্র সরকারী ক্ষেত্রগুলি এবং সম্ভবত একটি Equals
ওভাররাইড, ToString
ওভাররাইড এবংIEquatable(itsType).Equals
বাস্তবায়ন. ক্ষেত্রের সমষ্টি হিসাবে কাঠামোগুলি অবজেক্টস নয় এবং এটি ভান করা উচিত নয়। কাঠামোর দৃষ্টিকোণ থেকে, ক্ষেত্রের অর্থ "এই ক্ষেত্রটিতে লেখা শেষ জিনিস" এর চেয়ে বেশি বা কম কিছুই হওয়া উচিত নয়। কোনও অতিরিক্ত অর্থ ক্লায়েন্ট কোড দ্বারা নির্ধারণ করা উচিত।
উদাহরণস্বরূপ, যদি কোনও চলক-সমষ্টিগত কাঠামোর সদস্য থাকে Minimum
এবং Maximum
, স্ট্রাক্ট নিজেই কোনও প্রতিশ্রুতি দেয় না Minimum <= Maximum
। যে কোডটি প্যারামিটার হিসাবে এই জাতীয় কাঠামোটি গ্রহণ করে তার আচরণ করা উচিত যেমন এটি পৃথক Minimum
এবং Maximum
মানগুলি পাস করা হয়েছিল । যে প্রয়োজনীয়তা এর Minimum
চেয়ে বড় নয় Maximum
সেগুলি প্রয়োজনের মতো বিবেচনা করা উচিত যা কোনও Minimum
পরামিতি পৃথকভাবে পাস হওয়াগুলির চেয়ে বড় নয় Maximum
।
কখনও কখনও বিবেচনা করার জন্য একটি দরকারী প্যাটার্ন হ'ল ExposedHolder<T>
শ্রেণীর সংজ্ঞাযুক্ত কিছু রয়েছে:
class ExposedHolder<T>
{
public T Value;
ExposedHolder() { }
ExposedHolder(T val) { Value = T; }
}
যদি কারও কাছে একটি থাকে List<ExposedHolder<someStruct>>
, যেখানে someStruct
একটি পরিবর্তনশীল-সমষ্টিগত কাঠামো থাকে, তবে কেউ এর মতো কাজ করতে পারে myList[3].Value.someField += 7;
তবে myList[3].Value
অন্য Value
কোডকে দেওয়া এটির পরিবর্তনের কোনও উপায় দেওয়ার পরিবর্তে বিষয়বস্তু সরবরাহ করবে। বিপরীতে, যদি একটি ব্যবহার List<someStruct>
করে তবে এটি ব্যবহার করা প্রয়োজন var temp=myList[3]; temp.someField += 7; myList[3] = temp;
। যদি কেউ একটি পরিবর্তনীয় শ্রেণীর ধরণ ব্যবহার করে তবে myList[3]
বাইরের কোডের বিষয়বস্তু প্রকাশ করার জন্য সমস্ত ক্ষেত্রকে অন্য কোনও বস্তুর অনুলিপি করা দরকার require যদি এক একটি অপরিবর্তনীয় বর্গ প্রকার, বা একটি "অবজেক্ট শৈলী" struct হয় ব্যবহার করা হয়, এটি একটি নতুন দৃষ্টান্ত যা ভালো ছিল গঠন করা প্রয়োজন হবে myList[3]
ছাড়াsomeField
যা ভিন্ন ছিল, এবং তারপর তালিকায় যে নতুন ইনস্ট্যান্স সংরক্ষণ করি।
একটি অতিরিক্ত নোট: আপনি যদি বৃহত সংখ্যক অনুরূপ জিনিসগুলি সঞ্চয় করে থাকেন তবে এগুলি সম্ভবত কাঠামোগত নেস্টেড অ্যারেগুলিতে সংরক্ষণ করা ভাল হতে পারে, পছন্দ হিসাবে প্রতিটি অ্যারের আকার 1K এবং 64K বা এর মধ্যে রাখার চেষ্টা করছেন। স্ট্রাকচারের অ্যারেগুলি বিশেষ, সেই সূচকে কোনও তার মধ্যে কোনও কাঠামোর জন্য সরাসরি রেফারেন্স এনে দেয়, তাই কেউ "a [12] .x = 5;" বলতে পারেন। যদিও কেউ অ্যারের মতো অবজেক্টগুলি সংজ্ঞায়িত করতে পারে, সি # তাদের অ্যারের সাথে এ জাতীয় সিনট্যাক্স ভাগ করার অনুমতি দেয় না।