আপনি কখন ক্লাসের পরিবর্তে স্ট্রাক্ট ব্যবহার করবেন? [বন্ধ]


174

স্ট্র্টস বনাম ক্লাস কখন ব্যবহার করবেন সে সম্পর্কে আপনার আঙ্গুলের নিয়ম কী? আমি এই পদগুলির সি # সংজ্ঞার কথা ভাবছি তবে আপনার ভাষার যদি একই ধারণা থাকে তবে আমি আপনার মতামতটিও শুনতে চাই।

আমি প্রায় প্রতিটি কিছুর জন্য ক্লাস ব্যবহার করার প্রবণতা রাখি এবং স্ট্রাক্ট কেবল তখনই ব্যবহার করি যখন কিছু খুব সরল থাকে এবং একটি মান টাইপ হওয়া উচিত, যেমন একটি ফোননম্বার বা এর মতো কিছু something তবে এটি অপেক্ষাকৃত ছোট্ট ব্যবহারের মতো বলে মনে হয় এবং আমি আশা করি আরও আকর্ষণীয় ব্যবহারের ক্ষেত্রে রয়েছে are



7
@ ফ্রাস্ট্রেটেড কোনও প্রশ্ন অন্য কোনও সাইটের নকল হিসাবে চিহ্নিত করতে পারে না যদিও এটি অবশ্যই সম্পর্কিত।
অ্যাডাম শিখুন

@ আনা লিয়ার: আমি জানি, আমি সদৃশ-সদৃশ হিসাবে স্থানান্তরিত করতে ভোট দিয়েছি। একবার এটি স্থানান্তরিত হয়ে গেলে, এটি সদৃশ হিসাবে সঠিকভাবে বন্ধ করা যেতে পারে ।
হতাশ

5
@ ফ্রাস্ট্রেটেড আমি মনে করি না যে এটিকে স্থানান্তরিত করা দরকার।
অ্যাডাম লিয়ার

15
এটি P.SE বনাম SO এর চেয়ে অনেক বেশি উপযুক্ত একটি প্রশ্নের মতো মনে হচ্ছে। আমি এখানে কেন এটি জিজ্ঞাসা করেছি।
যৌক্তিকগীত

উত্তর:


169

অনুসরণ করার সাধারণ নিয়মটি হ'ল স্ট্রাক্টগুলি ছোট ছোট, সরল (এক-স্তর) সম্পর্কিত বৈশিষ্ট্যগুলির সংগ্রহ হতে হবে, যা একবার তৈরি হওয়ার পরে অপরিবর্তনীয়; অন্য কিছুর জন্য, একটি ক্লাস ব্যবহার করুন।

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

আমি বলি "বেশিরভাগই", কারণ স্ট্রাক্ট সম্পর্কে আরও গুরুত্বপূর্ণ জিনিসটি হ'ল এটি যেহেতু তারা মান ধরণের, তাদের ক্লাসগুলির মতো আচরণ করা (রেফারেন্স টাইপ) একটি বেদনা শেষ করতে পারে। বিশেষত, কোনও কাঠামোর বৈশিষ্ট্যগুলিকে পারস্পরিক পরিবর্তনযোগ্য করে তোলা অপ্রত্যাশিত আচরণের কারণ হতে পারে।

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

এখন, আপনি এটি একটি কাঠামো তৈরি করুন। বৈশিষ্ট্যগুলি এখনও পরিবর্তনযোগ্য। আপনি আগের মতো একই সিনট্যাক্স সহ একই ক্রিয়াকলাপ সম্পাদন করেন তবে এখন, এ এবং বি এর নতুন মানগুলি পদ্ধতিটি কল করার পরে উদাহরণটিতে নেই। কি হলো? ঠিক আছে, আপনার ক্লাসটি এখন স্ট্রাক্ট, মানে এটি একটি মান ধরণের। আপনি যদি কোনও পদ্ধতিতে মান প্রকারটি পাস করেন তবে ডিফল্ট (আউট বা রেফার কীওয়ার্ড ছাড়াই) "মান দ্বারা" পাস করতে হয়; পদ্ধতিটির ব্যবহারের জন্য উদাহরণটির অগভীর অনুলিপি তৈরি করা হয়, এবং পদ্ধতিটি প্রাথমিক উদাহরণটি অক্ষত রেখেই শেষ করা হয়।

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

এই কারণে, সি # তে কার্যত প্রতিটি কর্তৃপক্ষ আপনার কাঠামোকে সর্বদা অবিচ্ছিন্ন করতে বলে; গ্রাহককে কেবল কোনও অবজেক্ট তৈরির ক্ষেত্রে বৈশিষ্ট্যগুলির মানগুলি নির্দিষ্ট করার অনুমতি দিন এবং এই দৃষ্টান্তটির মানগুলি পরিবর্তন করার কোনও উপায় কখনই সরবরাহ করবেন না। পঠনযোগ্য ক্ষেত্রগুলি, বা কেবলমাত্র প্রাপ্ত বৈশিষ্ট্যগুলিই এই নিয়ম। গ্রাহক যদি মানটি পরিবর্তন করতে চান, তারা পুরানোটির মানগুলির উপর ভিত্তি করে তাদের পছন্দসই পরিবর্তনগুলি সহ একটি নতুন অবজেক্ট তৈরি করতে পারে বা তারা এমন কোনও পদ্ধতিতে কল করতে পারে যা একই কাজ করবে। এটি তাদের আপনার স্ট্রাক্টের একক উদাহরণটিকে একটি ধারণামূলক "মান" হিসাবে বিবেচনা করতে বাধ্য করে, অবিভাজ্য এবং অন্য সকলের থেকে (তবে সম্ভবত এটি সমানযোগ্য)। যদি তারা আপনার ধরণের দ্বারা সঞ্চিত "মান" -এ একটি ক্রিয়াকলাপ সম্পাদন করে তবে তারা একটি নতুন "মান" পায় যা তাদের প্রাথমিক মান থেকে পৃথক,

একটি ভাল উদাহরণের জন্য, ডেটটাইম টাইপটি দেখুন। আপনি ডেটটাইম উদাহরণের কোনও ক্ষেত্র সরাসরি বরাদ্দ করতে পারবেন না; আপনাকে অবশ্যই একটি নতুন তৈরি করতে হবে বা বিদ্যমান পদ্ধতিতে একটি পদ্ধতি কল করতে হবে যা একটি নতুন উদাহরণ তৈরি করবে। এটি হ'ল কারণ একটি তারিখ এবং সময় 5 মানের মতো একটি "মান" হয় এবং 5 নম্বরে পরিবর্তিত হয় এমন একটি নতুন মানের ফলাফল হয় যা 5 নয় Just কারণ 5 + 1 = 6 এর অর্থ 5 এখন 6 নয় কারণ আপনি এটিতে 1 যুক্ত করেছেন। ডেটটাইমস একইভাবে কাজ করে; 12:00 "হয়ে ওঠে না" 12:01 আপনি যদি এক মিনিট যোগ করেন তবে পরিবর্তে আপনি একটি নতুন মান পাবেন 12:01 যা 12:00 এর থেকে আলাদা। যদি এটি আপনার প্রকারের জন্য যৌক্তিক অবস্থার হয় (ভাল ধারণাগত উদাহরণ যা। নেট মধ্যে অন্তর্নিহিত নয়, হ'ল অর্থ, দূরত্ব, ওজন এবং এমন কোনও ইউওএমের অন্যান্য পরিমাণ যেখানে অপারেশনগুলি অবশ্যই মানটির সমস্ত অংশ বিবেচনা করে নেয়), তারপরে একটি কাঠামো ব্যবহার করুন এবং সে অনুযায়ী এটি নকশা করুন। বেশিরভাগ ক্ষেত্রে যেখানে কোনও সামগ্রীর উপ-আইটেমগুলি স্বাধীনভাবে পরিবর্তনযোগ্য হওয়া উচিত, সেখানে একটি শ্রেণি ব্যবহার করুন।


1
ভাল উত্তর! আমি একজনকে এটি 'ডোমেন ড্রাইভ ডেভলপমেন্ট' পদ্ধতি এবং বইতে পড়তে ইঙ্গিত করব, যা আপনার ধারণার সাথে কিছুটা সম্পর্কিত বলে মনে হচ্ছে যে আপনি কোন ধারণাকে ভিত্তি করে বাস্তবে বাস্তবায়নের চেষ্টা করছেন তার ভিত্তিতে শ্রেণি বা কাঠামো কেন ব্যবহার করা উচিত
ম্যাক্সিম পপরাভকো

1
উল্লেখ করার মতো মাত্র একটি বিশদ: আপনি কোনও স্ট্রাক্টে আপনার নিজস্ব ডিফল্ট নির্মাতাকে সংজ্ঞায়িত করতে পারবেন না। আপনাকে তার সাথে কিছু করতে হবে যা সবকিছুকে তার ডিফল্ট মানতে শুরু করে। সাধারণত, এটি বেশ গৌণ, বিশেষত ক্লাসে যারা স্ট্রাক্ট হওয়ার পক্ষে ভাল প্রার্থী। তবে এর অর্থ হ'ল একটি স্ট্রাক্টে একটি শ্রেণী পরিবর্তন করা কেবল একটি কীওয়ার্ড পরিবর্তন করার চেয়ে আরও বেশি বোঝাতে পারে।
লরেন্ট বোর্গাল্ট-রায়

1
@ লরেন্টবৌরগোল্ট-রায় - সত্য। এছাড়াও অন্যান্য গোটচ আছে; উদাহরণস্বরূপ স্ট্রাইকগুলির উত্তরাধিকারের শ্রেণিবদ্ধতা থাকতে পারে না। তারা ইন্টারফেস বাস্তবায়ন করতে পারে, তবে সিস্টেম.ভ্যালু টাইপ (অন্যথায় স্ট্রাইক দ্বারা স্পষ্টত) ব্যতীত অন্য কোনও কিছুই থেকে প্রাপ্ত হতে পারে না।
কিথস

একটি জাভাস্ক্রিপ্ট দেব হিসাবে আমাকে দুটি জিনিস জিজ্ঞাসা করতে হবে। স্ট্রাক্টের আদর্শ ব্যবহারের চেয়ে পৃথক বস্তুর আক্ষরিক কীভাবে এবং স্ট্রাক্টগুলি অপরিবর্তনীয় কেন এটি গুরুত্বপূর্ণ?
এরিক পুনরায়

1
@ এরিক রেপ্পেন: আপনার উভয় প্রশ্নের উত্তরে: যখন কোনও কাঠামো কোনও ফাংশনে স্থানান্তরিত হয়, তখন এটি মান দ্বারা পাস হয়। একটি শ্রেণীর সাথে, আপনি ক্লাসের একটি রেফারেন্স (এখনও মান দ্বারা এখনও) পাশ করছেন এরিক লিপার্ট আলোচনা করে কেন এটি একটি সমস্যা: ব্লগস.এমএসএনএন / বি / অ্যাপ্লিক্লিপার্ট / অর্চিভ / 2008 / 05 / 14/… । কিথস এর চূড়ান্ত অনুচ্ছেদেও এই প্রশ্নগুলি অন্তর্ভুক্ত রয়েছে।
ব্রায়ান

14

উত্তর: "খাঁটি ডেটা কনস্ট্রাক্টস এর জন্য কাঠামো ব্যবহার করুন এবং অপারেশন সহ অবজেক্টের জন্য একটি ক্লাস" অবশ্যই ভুল আইএমও। যদি স্ট্রাক্টে প্রচুর সংখ্যক বৈশিষ্ট্য থাকে তবে একটি শ্রেণি প্রায় সবসময়ই বেশি উপযুক্ত। মাইক্রোসফ্ট প্রায়শই বলছে, দক্ষতার দৃষ্টিকোণ থেকে, যদি আপনার ধরণটি 16 বাইটের চেয়ে বড় হয় তবে এটি একটি শ্রেণি হওয়া উচিত।

https://stackoverflow.com/questions/1082311/why-should-a-net-struct-be-less-than-16-bytes


1
একেবারে। যদি আমি পারতাম তবে উপড়ে ফেলব। স্ট্রাক্টস থেকে ধারণাটি কোথা থেকে এসেছে তা আমি ডেটা এবং অবজেক্টের জন্য পাই না। সি # তে একটি স্ট্রাক স্ট্যাকের জন্য বরাদ্দের জন্য কেবল একটি প্রক্রিয়া। পুরো স্ট্রাক্টের অনুলিপিগুলি কেবল কোনও অবজেক্ট পয়েন্টারটির অনুলিপি পরিবর্তে পাস করা হয়।
মাইক 30

2
@ মাইক - সি # স্ট্রাক্টগুলি প্রয়োজনীয়ভাবে স্ট্যাকের জন্য বরাদ্দ করা হয় না।
লি

1
@ মাইক "স্ট্রাক্টগুলি ডেটার জন্য রয়েছে" ধারণাটি সম্ভবত বহু বছরের সি প্রোগ্রামিংয়ের অভ্যাস থেকে এসেছে। সি এর কোনও শ্রেণি নেই এবং এর স্ট্রাক্টগুলি কেবলমাত্র ডেটা পাত্রে।
কোনামিমান

অবশ্যই মাইকেল কে এর উত্তর পড়ে কমপক্ষে 3 সি প্রোগ্রামার (
উত্সাহিত হয়ে) আছেন

10

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

বিটিডাব্লু, কমপক্ষে দুটি ক্ষেত্রে রয়েছে যেখানে স্ট্রাক্টগুলি যথাযথভাবে পার্সোনাল প্রকরণের রেফারেন্স রাখতে পারে।

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

পূর্বের দৃশ্যে, অবজেক্টের পরিচয় অপরিবর্তনীয় হবে; দ্বিতীয়টিতে, নেস্টেড অবজেক্টের শ্রেণি অপরিবর্তনীয়তা প্রয়োগ করতে পারে না, তবে কাঠামোটি রেফারেন্স ধারণ করে।


7

আমি স্ট্রাক্ট কেবল তখনই ব্যবহার করি যখন একটি পদ্ধতি প্রয়োজন হয় যাতে বর্গকে খুব "ভারী" বলে মনে হয়। সুতরাং কখনও কখনও আমি স্ট্র্টকে লাইটওয়েট অবজেক্ট হিসাবে বিবেচনা করি। সতর্কতা: এটি সর্বদা কাজ করে না এবং সবসময় করা সবচেয়ে ভাল জিনিস নয়, তাই এটি পরিস্থিতিটির উপর নির্ভর করে!

অতিরিক্ত উত্সসমূহ

আরও আনুষ্ঠানিক ব্যাখ্যার জন্য, এমএসডিএন বলে: http://msdn.microsoft.com/en-us/library/ms229017.aspx এই লিঙ্কটি আমি উপরে উল্লিখিত যাচাই করেছিলাম, স্ট্রোকগুলি কেবলমাত্র অল্প পরিমাণে ডেটা থাকার জন্য ব্যবহার করা উচিত।


5
অন্য সাইটে প্রশ্নগুলি (সেই সাইটটি স্ট্যাক ওভারফ্লো হলেও ) নকল হিসাবে গণনা করা হয় না। আসল উত্তর অন্তর্ভুক্ত করতে দয়া করে আপনার উত্তরটি প্রসারিত করুন এবং কেবল অন্য জায়গাগুলির লিঙ্ক নয়। লিঙ্কগুলি যদি কখনও পরিবর্তিত হয়, আপনার লিখিত উত্তরটি এখনই অকেজো হয়ে যাবে এবং আমরা তথ্য সংরক্ষণ এবং প্রোগ্রামারগুলিকে যথাসম্ভব স্ব-অন্তর্নিহিত করতে চাই। ধন্যবাদ!
অ্যাডাম লিয়ার

2
@ আন্না লিয়ার আমাকে জানা দেওয়ার জন্য ধন্যবাদ, এখন থেকে এটি মনে রাখবেন!
rrd

2
-1 "আমি স্ট্রাক্ট কেবল তখনই ব্যবহার করি যখন একটি পদ্ধতির প্রয়োজন হয় যাতে বর্গকে খুব" ভারী "বলে মনে হয়।" ... ভারী? এর আসলে কী অর্থ? ... এবং আপনি কি সত্যিই বলছেন যে কেবল একটি পদ্ধতি আছে তবে এটি সম্ভবত কাঠামো হওয়া উচিত?
bytedev

2

খাঁটি ডেটা কনস্ট্রাক্টসের জন্য স্ট্রাক্ট এবং ক্রিয়াকলাপের সাথে অবজেক্টগুলির জন্য একটি ক্লাস ব্যবহার করুন।

যদি আপনার ডেটা স্ট্রাকচারের অ্যাক্সেস নিয়ন্ত্রণের প্রয়োজন হয় না এবং পেতে / সেট ব্যতীত অন্য কোনও বিশেষ ক্রিয়াকলাপ নেই, তবে স্ট্রাকটি ব্যবহার করুন। এটি স্পষ্ট করে তোলে যে সমস্ত কাঠামো হ'ল ডেটার ধারক।

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

এটি একটি ইট এবং একটি বিমানের মধ্যে পার্থক্য হিসাবে ভাবেন। একটি ইট একটি কাঠামো; এটি দৈর্ঘ্য, প্রস্থ এবং উচ্চতা আছে। এটি বেশি কিছু করতে পারে না। একটি বিমানের একাধিক অপারেশন থাকতে পারে যা এটিকে কোনওভাবে পরিবর্তিত করতে পারে, যেমন নিয়ন্ত্রণের পৃষ্ঠতল সরানো এবং ইঞ্জিনের খোঁচা পরিবর্তনের মতো। এটি ক্লাস হিসাবে ভাল হবে।


2
সি # তে খাঁটি ডেটা কনস্ট্রাক্টসের জন্য কাঠামো এবং ক্রিয়াকলাপের সাথে অবজেক্টগুলির জন্য একটি ক্লাস ব্যবহার করুন "এটি আজেবাজে কথা। আমার উত্তর নীচে দেখুন।
বাইটেডেভ

1
"খাঁটি ডেটা কনস্ট্রাক্টের জন্য স্ট্রাক্ট এবং ক্রিয়াকলাপের সাথে অবজেক্টগুলির জন্য একটি ক্লাস ব্যবহার করুন।" এটি সি / সি ++ এর জন্য সত্য, সি #
টাকটাক 400
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.