স্ট্রাইক এবং ক্লাসগুলি সি # তে পৃথক ধারণা কেন?


44

সি # তে প্রোগ্রাম করার সময়, আমি এক অদ্ভুত ভাষা নকশার সিদ্ধান্তে হোঁচট খেয়েছিলাম যা আমি ঠিক বুঝতে পারি না।

সুতরাং, সি # (এবং সিএলআর) এর দুটি মোট ডেটা টাইপ রয়েছে: struct(মান-ধরণ, স্ট্যাকের উপর সঞ্চিত, কোনও উত্তরাধিকার নেই) এবং class(রেফারেন্স-টাইপ, গাদাতে সঞ্চিত, উত্তরাধিকার রয়েছে)।

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

সমস্যার সাধারণভাবে গৃহীত সমাধানগুলি সম্ভাব্য ভুলগুলি রোধ করার জন্য structসমস্তটির "অপরিবর্তনীয়" (তাদের ক্ষেত্র নির্ধারণ করা readonly) হিসাবে ঘোষণা করে, এর প্রয়োজনীয়তা সীমাবদ্ধ করে বলে মনে হচ্ছে struct

সি ++, উদাহরণস্বরূপ, আরও অনেক বেশি ব্যবহারযোগ্য মডেল নিয়োগ করে: এটি আপনাকে স্ট্যাক বা স্তূপে একটি অবজেক্ট উদাহরণ তৈরি করতে এবং মান দ্বারা বা রেফারেন্স দ্বারা (বা পয়েন্টার দ্বারা) পাস করার অনুমতি দেয়। আমি শুনছি যে সি # সি ++ দ্বারা অনুপ্রাণিত হয়েছিল এবং আমি কেন বুঝতে পারি না কেন এটি এই কৌশলটি গ্রহণ করেনি। দুটি পৃথক বরাদ্দ বিকল্প (হিপ এবং স্ট্যাক) দিয়ে একত্রিত করা এবং একের মধ্যে বিলম্ব করা classএবং structমান হিসাবে বা (স্পষ্টভাবে) পাসওয়ার্ড হিসাবে refএবং outকীওয়ার্ডগুলির মাধ্যমে উল্লেখ হিসাবে খুব সুন্দর জিনিস বলে মনে হচ্ছে।

প্রশ্ন হলো, কেন হয়নি করা হয় classএবং structC # এর পৃথক ধারণা এবং দুই বরাদ্দ বিকল্প সহ এক সমষ্টিগত টাইপ করার পরিবর্তে CLR হবেন?


34
"সমস্যার সাধারণভাবে গৃহীত সমাধানগুলি সমস্ত স্ট্রাককে" অপরিবর্তনীয় "হিসাবে ঘোষণা করে বলে মনে হচ্ছে ... স্ট্রাক্টের উপযোগিতা সীমাবদ্ধ করে" অনেক লোক যুক্তিযুক্ত হতে পারে যে অপরিবর্তনীয় যে কোনও জিনিস সাধারণত এটি আরও কার্যকর করে তোলে যখনই এটি কোনও কার্যকারিতা বাধা সৃষ্টি না করে। এছাড়াও, structগুলি সবসময় স্ট্যাকের মধ্যে সংরক্ষণ করা হয় না; একটি structক্ষেত্র সহ একটি বিষয় বিবেচনা করুন । ম্যাসন হুইলারের কথা যেমন উল্লেখ করা হয়েছে, স্লাইসিংয়ের সমস্যাটি সম্ভবত সবচেয়ে বড় কারণ।
ডোভাল

7
এটি সত্য নয় যে সি # সি ++ দ্বারা অনুপ্রাণিত হয়েছিল; বরং সি # টি সি ++ এবং জাভা উভয়ের ডিজাইনে থাকা সমস্ত (ভাল বোঝানো এবং ভাল শোনানো) দ্বারা অনুপ্রাণিত হয়েছিল।
পিটার জেরকেন্স

18
দ্রষ্টব্য: স্ট্যাক এবং হিপ বাস্তবায়নের বিশদ। এমন কিছু নেই যা বলছে যে স্ট্রাক্ট দৃষ্টান্তগুলি স্ট্যাকের জন্য বরাদ্দ করতে হয়েছে এবং শ্রেণীর দৃষ্টান্তগুলি স্তূপে বরাদ্দ করতে হয়েছে। এবং এটি বাস্তবে সত্যও নয়। উদাহরণস্বরূপ, এটি খুব সম্ভব যে কোনও সংকলক এস্কেপ এনালাইসিস ব্যবহার করে নির্ধারণ করতে পারে যে কোনও ভেরিয়েবল স্থানীয় ক্ষেত্র থেকে বাঁচতে পারে না এবং এটি শ্রেণীর উদাহরণ হলেও স্ট্যাকের উপর বরাদ্দ দেয়। এমনকি এটি এমনকি বলা হয় না যে এখানে কোনও স্ট্যাক বা একটি গাদা থাকতে হবে। আপনি গাদা একটি লিঙ্কযুক্ত তালিকা হিসাবে পরিবেশ ফ্রেম বরাদ্দ করতে পারে এবং এমনকি একটি স্ট্যাক নাও।
Jörg W Mittag


3
"তবে আপনি একটি সামগ্রিক ধরণের পরামিতি গ্রহণের কোনও পদ্ধতিতে হোঁচট খাচ্ছেন এবং এটি কোনও মান ধরণের বা কোনও রেফারেন্স টাইপের প্রকৃতপক্ষে কিনা তা নির্ধারণ করার জন্য আপনাকে তার ধরণের ঘোষণাটি খুঁজে বের করতে হবে" উম্মু, কেন বিষয়টি সঠিকভাবে আসে? ? পদ্ধতিটি আপনাকে একটি মান পাস করতে বলে। আপনি একটি মান পাস। এটি কোন রেফারেন্স টাইপ বা মানের ধরণের কিনা তা নিয়ে আপনার কী যত্ন নেওয়া উচিত?
লুয়ান

উত্তর:


58

সি # (এবং জাভা এবং মূলত সি ++ এর পরে অন্য প্রতিটি ওও ভাষার ভাষা বিকাশ করা হয়েছে) এই দিকটিতে সি ++ এর মডেলটি অনুলিপি করেননি কারণ সি ++ এটি যেভাবে করেছে তা ভয়াবহ গোলযোগ।

আপনি উপরের সম্পর্কিত পয়েন্টগুলি সঠিকভাবে চিহ্নিত করেছেন struct: মানের ধরণ, কোনও উত্তরাধিকার নেই। class: রেফারেন্স টাইপ, উত্তরাধিকার আছে। উত্তরাধিকার এবং মানের ধরণের (বা আরও সুনির্দিষ্টভাবে বলা যায়, বহুবর্ষ এবং পাস-বাই-ভ্যালু) মিশ্রিত হয় না; যদি আপনি টাইপের কোনও অবজেক্টকে Derivedকোনও পদ্ধতির আর্গুমেন্টে প্রেরণ করেন Baseএবং তারপরে এটি ভার্চুয়াল পদ্ধতিতে কল করেন, সঠিক আচরণ পাওয়ার একমাত্র উপায়টি যা পাস করেছে তা নিশ্চিত হওয়া ensure

এর মধ্যে এবং অন্যান্য যে সমস্ত গণ্ডগোলের মধ্যে আপনি সি ++ তে চলেছেন মূল্যের ধরণের হিসাবে উত্তরাধিকার সূত্রে প্রাপ্ত সামগ্রী (অনুলিপি নির্মাণকারী এবং অবজেক্ট স্লাইসিংয়ের কথা মাথায় আসে!) সেরা সমাধানটি কেবল বলুন না to

ভাল ভাষার নকশা কেবল বৈশিষ্ট্যগুলি বাস্তবায়ন করে না, কী কী বৈশিষ্ট্যগুলি প্রয়োগ করা উচিত নয় তাও তা জেনে রাখা এবং এটি করার সর্বোত্তম উপায়গুলির মধ্যে একটি হ'ল আপনার আগে যারা এসেছিল তাদের ভুল থেকে শিক্ষা নেওয়া।


29
এটি সি ++ তে এখনও অন্য একটি অর্থহীন বিষয়বহুল অভিজাত। ডাউনভোট করতে পারব না, তবে যদি পারতাম।
বারটেক বানাচেউইচজ

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

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

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

9
আপনি যদি আপনার শেষ অনুচ্ছেদে শীর্ষে যান এবং বর্তমান প্রথম অনুচ্ছেদটি মুছে ফেলেন তবে আমার মনে হয় আপনার সঠিক যুক্তি রয়েছে। তবে বর্তমান প্রথম অনুচ্ছেদটি কেবলমাত্র বিষয়গত is
মার্টিন ইয়র্ক

19

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

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

এটি দর্শনের মৌলিক পার্থক্য প্রতিফলিত করে: সি ++ আপনাকে প্রয়োজনীয় সমস্ত ডিজাইনের প্রয়োজন হতে পারে যা আপনার প্রয়োজন হতে পারে give এটি কীভাবে আপনি এই সরঞ্জামগুলি ব্যবহার করেন তা নিয়ন্ত্রণে প্রায় কোনও প্রয়াসই তৈরি করে না, তাই বিরল পরিস্থিতিতে কেবলমাত্র কার্যকরভাবে নকশাকৃত নকশাগুলি তৈরি করার জন্য এগুলি ব্যবহার করা সহজ, পাশাপাশি এমন নকশাগুলিও সম্ভবত সম্ভবত একটি দুষ্টু ধারণা এবং এমন পরিস্থিতিতে কেউ জানেন না যে তারা সম্ভবত ভাল কাজ করার সম্ভাবনা আছে। বিশেষত, নকশার সিদ্ধান্তগুলি ডিউপলিংয়ের মাধ্যমে এগুলির একটি বিরাট কাজ করা হয় - এমনকি বাস্তবে এটি প্রায় সবসময় মিলিত হয়। ফলস্বরূপ, কেবল সি ++ লেখার এবং সি ++ ভাল লেখার মধ্যে বিশাল পার্থক্য রয়েছে। সি ++ ভাল লিখতে গেলে আপনাকে প্রচুর রীতিমতো আইডিয়াম এবং নিয়ম জানতে হবে (থাম্বের অন্যান্য নিয়ম ভঙ্গ করার আগে পুনরায় বিবেচনা করার জন্য কতটা গুরুত্ব সহকারে থাম্বের বিধি রয়েছে)। ফলস্বরূপ, সি ++ শেখার সহজতার চেয়ে ব্যবহারের স্বাচ্ছন্দ্যের (বিশেষজ্ঞদের দ্বারা) আরও অনেক বেশি মনোযোগী। এমন অনেকগুলি (অনেকগুলি) পরিস্থিতি রয়েছে যেখানে এটি ব্যবহার করা সত্যই মারাত্মক সহজ নয়।

ভাষা ডিজাইনাররা ভাল ডিজাইনের অনুশীলনগুলি কী বিবেচনা করে তা জোর করার চেষ্টা করার জন্য সি # আরও অনেক কিছু করেছে (বা কমপক্ষে অত্যন্ত দৃ strongly়তার সাথে পরামর্শ দেয়)। বেশ কয়েকটি বিষয় যা সি ++ এ ডুপ্লুপ হয় (তবে সাধারণত অনুশীলনে একসাথে যায়) সরাসরি সি # তে মিলিত হয়। এটি "অনিরাপদ" কোডটিকে সীমানাটিকে কিছুটা ধাক্কা দেওয়ার অনুমতি দেয়, তবে সত্যই, পুরোটা নয়।

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

সুতরাং দুটি ভাষাতে কীভাবে classএবং কীভাবে এই প্রশ্নটি রয়েছে সে সম্পর্কে আরও সুনির্দিষ্টভাবে তাকান struct: একটি উত্তরাধিকার শ্রেণিবিন্যাসে তৈরি বস্তুগুলি যেখানে আপনি তার ভিত্তি শ্রেণি / ইন্টারফেসের ছদ্মবেশে কোনও উত্পন্ন শ্রেণীর কোনও অবজেক্ট ব্যবহার করতে পারেন, আপনি খুব সুন্দর একটি সাধারণ পয়েন্টার বা রেফারেন্সের মাধ্যমে আপনার সাধারণত এটি করা দরকার - এটিকে আটকে রেখে একটি দৃ a় স্তরে, উত্পন্ন শ্রেণীর অবজেক্টে এমন কিছু মেমরি থাকে যা বেস শ্রেণীর উদাহরণ হিসাবে বিবেচনা করা যেতে পারে / ইন্টারফেস এবং উত্পন্ন বস্তুটি মেমরির সেই অংশের ঠিকানার মাধ্যমে চালিত হয় ulated

সি ++ তে, প্রোগ্রামারটি এটি সঠিকভাবে করাতে পারে - যখন তিনি উত্তরাধিকার ব্যবহার করছেন, তখন এটি নিশ্চিত করা তাঁর (যেমন উদাহরণস্বরূপ) বংশগতিতে পলিমারফিক ক্লাসগুলির সাথে কাজ করে এমন একটি ফাংশন এটি পয়েন্টার বা বেসের রেফারেন্সের মাধ্যমে করে বর্গ।

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


2
সি ++ অনুরাগী হিসাবে, আমি মনে করি এটি সি # এবং সুইস আর্মি চেনসোর মধ্যে পার্থক্যের একটি দুর্দান্ত সংক্ষিপ্তসার।
ডেভিড থর্নলি

1
@ ডেভিডথর্নলি: আমি অন্তত যা কিছুটা ভারসাম্যপূর্ণ তুলনা বলে মনে করেছি তা লেখার চেষ্টা করেছি। আঙ্গুলগুলি নির্দেশ করার জন্য নয়, তবে আমি যখন এটি লিখেছিলাম তখন কিছু কিছু আমাকে আঘাত করেছিল ... কিছুটা ভুল (এটি সুন্দরভাবে বলতে গেলে)।
জেরি কফিন

7

এটি "সি # থেকে: আমাদের অন্য ভাষার প্রয়োজন কেন?" - গোনারসন, এরিক:

সরলতা সি # এর জন্য একটি গুরুত্বপূর্ণ নকশা লক্ষ্য ছিল।

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

[...]

মানের ধরণ , অপারেটর ওভারলোডিং এবং ব্যবহারকারী-সংজ্ঞায়িত রূপান্তরগুলি সমস্ত ভাষাতেই জটিলতা যুক্ত করে তবে একটি গুরুত্বপূর্ণ ব্যবহারকারীর দৃশ্যাবলী মারাত্মকভাবে সরল করার অনুমতি দেয়।

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

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


1
আমি জানি না, সম্ভবত এইসব নোংরা, কুৎসিত এবং খারাপ জিনিস ব্যবহার করা হচ্ছে না-
বারটেক বানাচেউইচজ

হতে পারে ... আমি একটি হারিয়ে যাওয়া কারণ।
ম্যানলিও

2
আইএমএইচও, জাভা ডিজাইনের অন্যতম বৃহত ত্রুটি হ'ল ঘোষিত করার কোনও উপায়ের অভাব যা পরিচয় বা মালিকানা সজ্জিত করতে ব্যবহৃত হয় এবং সি # এর বৃহত্তম ত্রুটিগুলির মধ্যে একটি অপারেশনকে আলাদা করার উপায়ের অভাব is কোনও বস্তুর ক্রিয়াকলাপ থেকে কোনও ভেরিয়েবল যার সাথে একটি ভেরিয়েবল একটি রেফারেন্স ধরে holds এমনকি রানটাইম এ ধরণের পার্থক্যের বিষয়ে চিন্তা না করেও, কোনও ভাষায় নির্দিষ্ট করে রাখতে সক্ষম হচ্ছিল যে প্রকারের int[]পরিবর্তনশীলগুলি ভাগযোগ্য বা পরিবর্তনযোগ্য হবে (অ্যারেগুলি উভয়ই হতে পারে, তবে উভয়ই নয়) ভুল কোডকে ভুল দেখায় help
সুপারক্যাট

4

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

// Defined structure
struct Point : IEquatable<Point>
{
  public int X,Y;
  public Point(int x, int y) { X=x; Y=y; }
  public bool Equals(Point other) { return X==other.X && y==other.Y; }
  public bool Equals(Object other)
  { return other != null && other.GetType()==typeof(this) && Equals(Point(other)); }
  public bool ToString() { return String.Format("[{0},{1}", x, y); }
  public bool GetHashCode() { return unchecked(x+y*65531); }
}        
// Auto-generated class
class boxed_Point: IEquatable<Point>
{
  public Point value; // Fake name; C++/CLI, though not C#, allow full access
  public boxed_Point(Point v) { value=v; }
  // Members chain to each member of the original
  public bool Equals(Point other) { return value.Equals(other); }
  public bool Equals(Object other) { return value.Equals(other); }
  public String ToString() { return value.ToString(); }
  public Int32 GetHashCode() { return value.GetHashCode(); }
}

এবং একটি বিবৃতি যেমন: কনসোল.উরাইটলাইন ("মানটি {0}", কিছু পয়েন্ট);

হিসাবে অনুবাদ করা হবে: boxed_PPoint box1 = নতুন বক্সড_পয়েন্ট (কোনও পয়েন্ট); কনসোল.উরাইটলাইন ("মানটি {0}", বক্স 1);

অনুশীলনে, যেহেতু স্টোরেজ অবস্থানের ধরণ এবং হিপ উদাহরণের ধরণগুলি পৃথক ইউনিভার্সগুলিতে বিদ্যমান, হিপ-উদাহরণস্বরূপের মতো জিনিসগুলি কল করা প্রয়োজন হয় না boxed_Int32; যেহেতু সিস্টেমটি জানতে পারে যে কোন প্রসঙ্গের জন্য হিপ-অবজেক্ট ইনস্ট্যান্স প্রয়োজন এবং কোনটিগুলির জন্য একটি স্টোরেজ অবস্থানের প্রয়োজন।

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.