ক classএবং এ এর মধ্যে সবচেয়ে গুরুত্বপূর্ণ পার্থক্য structহ'ল নিম্নলিখিত পরিস্থিতিতে যা ঘটে:
জিনিস জিনিস 1 = নতুন জিনিস ();
জিনিস 1.somePropertyOrField = 5;
জিনিস জিনিস 2 = জিনিস 1;
জিনিস 2.somePropertyOrField = 9;
সর্বশেষ বিবৃতিটির প্রভাব কী হওয়া উচিত thing1.somePropertyOrField? যদি Thingএকটি struct, এবং somePropertyOrFieldএকটি উন্মুক্ত পাবলিক ক্ষেত্র, বস্তু হয় thing1এবং thing2একে অপরের থেকে "বিচ্ছিন্ন" হতে হবে, তাই আধুনিক বিবৃতি প্রভাবিত করবে না thing1। যদি Thingএকটি শ্রেণি হয়, তবে thing1এবং thing2একে অপরের সাথে সংযুক্ত থাকবে, এবং সুতরাং পরবর্তী বিবৃতিটি লিখবে thing1.somePropertyOrField। প্রাক্তন শব্দার্থবিজ্ঞানগুলি আরও অর্থবোধ তৈরি করে এমন ক্ষেত্রে একটি কাঠামো ব্যবহার করা উচিত এবং পরবর্তী শব্দার্থবিজ্ঞানগুলি আরও অর্থবোধ করতে পারে এমন ক্ষেত্রে একটি শ্রেণি ব্যবহার করা উচিত।
নোট করুন যেহেতু কিছু লোক পরামর্শ দিচ্ছেন যে কোনও কিছুকে পরিবর্তনযোগ্য করার আকাঙ্ক্ষা বর্গ হওয়ার পক্ষে এটি একটি যুক্তি, তবে আমি সুপারিশ করব বিপরীতটি সত্য: যদি কিছু ডেটা রাখার উদ্দেশ্যে উপস্থিত থাকে তবে তা পরিবর্তনযোগ্য হতে চলেছে, এবং উদাহরণগুলি যদি কোনও কিছুর সাথে সংযুক্ত থাকে কিনা তা যদি স্পষ্ট না হয় তবে জিনিসটি একটি কাঠামো (সম্ভবত উদ্ভাসিত ক্ষেত্রগুলি সহ) হওয়া উচিত যাতে স্পষ্ট করে দেওয়া যায় যে উদাহরণগুলি অন্য কোনও কিছুর সাথে সংযুক্ত নেই।
উদাহরণস্বরূপ, বিবৃতিগুলি বিবেচনা করুন:
ব্যক্তি সামান্য পার্সন = myPeople.GetPerson ("123-45-6789");
somePerson.Name = "মেরি জনসন"; // "মেরি স্মিথ" থাকতেন
দ্বিতীয় বিবৃতিতে সংরক্ষিত তথ্যের পরিবর্তন হবে myPeople? যদি Personকোনও উন্মুক্ত ক্ষেত্র কাঠামো হয়, তবে তা হবে না এবং এটি যে কোনও উন্মুক্ত ক্ষেত্র কাঠামো হওয়ার সুস্পষ্ট পরিণতি হবে না ; যদি Personকোনও স্ট্রাক্ট থাকে এবং কেউ আপডেট করতে চায় myPeopleতবে স্পষ্টতই এমন কিছু করতে হবে myPeople.UpdatePerson("123-45-6789", somePerson)। যদি Personকোনও শ্রেণি হয় তবে উপরের কোডটি কখনই এর বিষয়বস্তু আপডেট করে না MyPeople, সর্বদা এটি আপডেট করে বা কখনও কখনও আপডেট করে কিনা তা নির্ধারণ করা আরও কঠিন হতে পারে ।
স্ট্রাক্টগুলি "অপরিবর্তনীয়" হওয়া উচিত এমন ধারণা সম্পর্কে, আমি সাধারণভাবে একমত নই। "অপরিবর্তনীয়" স্ট্রাক্টগুলির জন্য বৈধ ব্যবহারের কেস রয়েছে (যেখানে কনস্ট্রাক্টরে আক্রমণকারীদের প্রয়োগ করা হয়) তবে এটির যে কোনও অংশ পরিবর্তিত হওয়ার পরে পুরো স্ট্রাক্ট অবশ্যই যে কোনও সময় লিখতে হবে, এটি বিশ্লেষণহীন, অপব্যয়যুক্ত এবং বাগের কারণ হতে পারে আরও সহজভাবে প্রকাশের চেয়ে আরও উপযুক্ত ক্ষেত্র সরাসরি উদাহরণস্বরূপ, এমন একটি PhoneNumberকাঠামো বিবেচনা করুন যার ক্ষেত্রগুলি, অন্যদের মধ্যে অন্তর্ভুক্ত থাকে AreaCodeএবং Exchange, এবং মনে করুন যে এর একটি রয়েছে List<PhoneNumber>। নিম্নলিখিতগুলির প্রভাবটি বেশ পরিষ্কার হওয়া উচিত:
(int i = 0; i <myList.Count; i ++) এর জন্য
{
ফোন নাম্বার দ্য নাম্বার = মাইলিস্ট [i];
যদি (দি নাম্বার.আরিয়া কোড == "312")
{
স্ট্রিং নিউ এক্সচেঞ্জ = "";
যদি (new312to708Exchanges.TryGetValue (theNumber.Exchange), নতুন এক্সচেঞ্জ আউট)
{
theNumber.AreaCode = "708";
theNumber.Exchange = নতুন এক্সচেঞ্জ;
মাইলিস্ট [i] = দি সংখ্যা;
}
}
}
মনে রাখবেন যে, কোনরকম উপরের কোড জানে বা যে কোন ক্ষেত্র বজায় রাখে PhoneNumberছাড়া অন্য AreaCodeএবং Exchange। যদি PhoneNumberতথাকথিত "অপরিবর্তনীয়" কাঠামো হত তবে এটি প্রয়োজন হবে যে এটি withXXপ্রতিটি ক্ষেত্রের জন্য একটি পদ্ধতি সরবরাহ করবে, যা একটি নতুন কাঠামোর উদাহরণটি ফিরিয়ে আনবে যা নির্দেশিত ক্ষেত্রটিতে উত্তীর্ণ মান রেখেছিল, অন্যথায় এটি প্রয়োজনীয় হবে কাঠামোর প্রতিটি ক্ষেত্র সম্পর্কে জানতে উপরের মত কোডের জন্য। হুবহু আবেদন নয়।
বিটিডাব্লু, কমপক্ষে দুটি ক্ষেত্রে রয়েছে যেখানে স্ট্রাক্টগুলি যথাযথভাবে পার্সোনাল প্রকরণের রেফারেন্স রাখতে পারে।
- কাঠামোর শব্দার্থবিদ্যা ইঙ্গিত দেয় যে এটি বস্তুর বৈশিষ্ট্য ধরে রাখার শর্টকাট হিসাবে নয় বরং প্রশ্নে বস্তুর পরিচয় সংরক্ষণ করছে। উদাহরণস্বরূপ, একটি `কীভ্যালিউপায়ার নির্দিষ্ট কিছু বোতামগুলির পরিচয় রাখে, তবে সেই বোতামগুলির অবস্থান, হাইলাইট স্টেটস ইত্যাদি সম্পর্কে অবিরাম তথ্য রাখার আশা করা হবে না would
- কাঠামোটি জানে যে এটি কেবলমাত্র সেই অবজেক্টের একমাত্র রেফারেন্স ধরে রেখেছে, অন্য কেউ রেফারেন্স পাবে না এবং যে কোনও মিউটেশন যা কখনই সেই বস্তুর সাথে সম্পাদিত হবে এটি কোনও রেফারেন্সের রেফারেন্সের আগেই এটি সংরক্ষণ করা হবে।
পূর্বের দৃশ্যে, অবজেক্টের পরিচয় অপরিবর্তনীয় হবে; দ্বিতীয়টিতে, নেস্টেড অবজেক্টের শ্রেণি অপরিবর্তনীয়তা প্রয়োগ করতে পারে না, তবে কাঠামোটি রেফারেন্স ধারণ করে।