সি # তে কোন রেফারেন্স টাইপ এবং মান টাইপের মধ্যে পার্থক্য কী?


100

কয়েকজন লোক আমাকে কয়েক মাস আগে এই প্রশ্ন জিজ্ঞাসা করেছিল এবং আমি এটি বিস্তারিতভাবে বলতে পারি না। একটি রেফারেন্স টাইপ এবং সি # তে একটি মান ধরণের মধ্যে পার্থক্য কী?

আমি জানি যে মান ধরনের হয় int, bool, float, ইত্যাদি এবং রেফারেন্স ধরনের হয় delegate, interfaceইত্যাদি অথবা এই ভুল করার ইচ্ছে?

আপনি কি আমাকে পেশাদার উপায়ে এটি ব্যাখ্যা করতে পারেন?


4
একটি ছোট নোট হিসাবে, আমি মনে করি প্রশ্নটি সি # সম্পর্কে জিজ্ঞাসা করা হয়েছে, তবে বাস্তবে এটি সি # +। নেট সম্পর্কে। আপনি নেট # বিশ্লেষণ না করে সি # বিশ্লেষণ করতে পারবেন না। আমি প্রশ্নটি ফিরিয়ে আনব না কারণ অন্য বিশ্লেষণ না করে একটি বিশ্লেষণ করার জন্য কিছু পয়েন্ট থাকতে পারে (পুনরাবৃত্তকারী এবং বন্ধ, আমি আপনাকে দেখছি)
xanatos

@ এক্সানটোস এটি সিএলআই সম্পর্কে সর্বাধিক উপযুক্ত প্রশ্ন যা সি #, ভিবি.নেট এবং নেট সব মিল রয়েছে। সি এল এলির জন্য একটি ট্যাগ থাকা উচিত তবে সি এল এল অন্য কোনও কিছুর জন্য নেওয়া হয়। সিএলআর আছে তবে এটি একটি বাস্তবায়ন, মান নয়।
ব্যবহারকারী 34660

উত্তর:


172

তোমার উদাহরণ একটু কারণ যখন বিজোড় হয় int, boolএবং floatনির্দিষ্ট ধরনের, ইন্টারফেস এবং প্রতিনিধিদের হয় ধরণের ধরনের - শুধু মত structএবং enumমান ধরনের ধরণের হয়।

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

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

উদাহরণস্বরূপ, কাগজের টুকরোটির মতো ভেরিয়েবলের কথা ভাবেন। এটিতে "5" বা "মিথ্যা" মান লেখা থাকতে পারে তবে এটি আমার বাড়ি থাকতে পারে না ... এটির জন্য আমার বাড়ির দিকনির্দেশনা থাকতে হবে। এই দিকনির্দেশগুলি একটি রেফারেন্সের সমতুল্য। বিশেষত, দু'জনের কাছে আমার বাড়ির একই দিক নির্দেশক কাগজের বিভিন্ন টুকরো থাকতে পারে - এবং যদি কোনও ব্যক্তি সেই দিকনির্দেশগুলি অনুসরণ করে এবং আমার বাড়ি লাল রঙ করেন, তবে দ্বিতীয় ব্যক্তিও সেই পরিবর্তন দেখতে পাবেন। যদি উভয়েই কেবল কাগজের উপরে আমার বাড়ির পৃথক ছবি রাখে, তবে একজন ব্যক্তি তাদের কাগজটি আঁকেন তবে অন্য ব্যক্তির কাগজটি একেবারেই বদলাবে না।


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

আমি এই বিট পাইনি - while int, bool and float are specific types, interfaces and delegates are kinds of type - just like struct and enum are kinds of value types। বুল নির্দিষ্ট ধরণের হওয়া মানে কী? সি # তে সমস্ত কিছুই যেমন ইন্ট, বুল, ফ্লোট, ক্লাস, ইন্টারফেস, ডেলিগেট একটি প্রকার (ডেটা টাইপ সুনির্দিষ্ট হওয়ার জন্য)। ডেটা টাইপগুলি সি # তে 'রেফারেন্স টাইপ' এবং 'মান প্রকার' হিসাবে আলাদা করা হয়। তারপর আপনি কেন বলছেন int- এ একটি নির্দিষ্ট ধরনের কিন্তু ইন্টারফেস একটি হল ধরনের ধরনের?
আরবিটি

4
@ আরবিটি: ডেটা টাইপগুলি কেবল "রেফারেন্স টাইপ" এবং "মান ধরণের" তে বিভক্ত হয় না । এগুলি "শ্রেণি, কাঠামো, এনাম, প্রতিনিধি, ইন্টারফেস" এও আলাদা করা হয়েছে। intস্ট্রাক্ট, stringএকটি শ্রেণি, Actionপ্রতিনিধি ইত্যাদি etc. বিভিন্ন ধরণের জিনিসযুক্ত একটি তালিকা।
জন স্কিটি

@ জোনস্কিট সম্ভবত পোস্টটির উত্তরগুলি তখন কিছুটা বিভ্রান্তিকর।
আরবিটি

@ আরবিটি: আমি বলব এটি কিছুটা খারাপভাবে শব্দযুক্ত, তবে ভয়ঙ্কর নয়।
জন স্কিটে

27

মান প্রকার:

কিছু মান ধরে যা মেমরি ঠিকানাগুলি নয়

উদাহরণ:

কাঠামো

স্টোরেজ:

টিএল; ডিআর : ভেরিয়েবলের মান যেখানেই এটি কমে যায় সেখানে সংরক্ষণ করা হয়। উদাহরণস্বরূপ স্থানীয় ভেরিয়েবলগুলি স্ট্যাকের উপরে থাকে তবে সদস্য হিসাবে শ্রেণীর অভ্যন্তরে ঘোষিত হওয়ার পরে এটি ক্লাসের সাথে দৃ declared়ভাবে মিলিতভাবে ঘোষিত হয়।
দীর্ঘতর : সুতরাং যেখানে মান ঘোষণা করা হয় সেখানে ধরণের মান সংরক্ষণ করা হয়। উদাহরণস্বরূপ: একটি intস্থানীয় ভেরিয়েবল হিসাবে একটি ফাংশনের অভ্যন্তরের একটি মান স্ট্যাকের মধ্যে সংরক্ষণ করা হবে, যখন কোনও intশ্রেণীর সদস্য হিসাবে ঘোষিত মানটির মানটি ঘোষিত শ্রেণীর সাথে স্তূপে সংরক্ষণ করা হবে on একটি শ্রেণীর একটি জীবনকাল থাকে যা ক্লাস হিসাবে ঘোষণা করা হয় ঠিক তার সমান, আবর্জনা সংগ্রহকারী দ্বারা প্রায় কোনও কাজ করার প্রয়োজন হয় না। এটা আরো জটিল যদিও আমি @ JonSkeet এর বই "পড়ুন চাই C # গভীরতা "আরও সংক্ষিপ্ত ব্যাখ্যার জন্য .NET এ মেমরি

সুবিধাদি:

একটি মান ধরণের অতিরিক্ত আবর্জনা সংগ্রহের প্রয়োজন হয় না। এটি যেভাবে বাস করে তার সাথে এটি জঞ্জাল সংগ্রহ করে methods পদ্ধতিতে স্থানীয় ভেরিয়েবলগুলি পদ্ধতি ছাড়ার পরে পরিষ্কার হয়ে যায়।

ত্রুটিগুলি:

  1. যখন মানগুলির বড় সেটটি কোনও পদ্ধতিতে পাস করা হয় তখন প্রাপ্ত ভেরিয়েবলটি অনুলিপি করে তাই মেমরিতে দুটি রিডানড্যান্ট মান থাকে।

  2. ক্লাসগুলি মিস হয়ে গেছে it সমস্ত ওপ বেনিফিট লোকসান

উল্লেখের ধরণ:

একটি মান না মান একটি মেমরি ঠিকানা রাখা

উদাহরণ:

ক্লাস

স্টোরেজ:

স্তূপে সঞ্চিত

সুবিধাদি:

  1. আপনি যখন কোনও পদ্ধতিতে রেফারেন্স ভেরিয়েবলটি পাস করেন এবং এটি পরিবর্তিত হয় তখন এটি প্রকৃত মানটি পরিবর্তন করে যখন মানের ধরণে প্রদত্ত ভেরিয়েবলের একটি অনুলিপি নেওয়া হয় এবং সেই মানটি পরিবর্তিত হয়।

  2. ভেরিয়েবলের আকার যখন বড় হয় তবে রেফারেন্স টাইপটি ভাল

  3. ক্লাসগুলি যেমন একটি রেফারেন্স টাইপ ভেরিয়েবল হিসাবে আসে, তারা পুনরায় ব্যবহারযোগ্যতা দেয়, এভাবে অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিংয়ের উপকার হয়

ত্রুটিগুলি:

বরাদ্দকালে আরও কাজের রেফারেন্সিং এবং আবর্জনা সংগ্রাহকের জন্য ভ্যালু.এেক্সট্রা ওভারলোড পড়ার সময় ডিলেফারেন্স


4
এটি অগত্যা সত্য নয় যে রেফারেন্সের ধরণগুলি গাদাতে সংরক্ষণ করা হয় এবং মানের ধরণগুলি স্ট্যাকের উপরে সঞ্চয় হয়। আপনি আরও জানতে চাইলে yoda.arachsys.com/csharp/memory.html পড়ুন ।
Rhys

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

13

কম্পিউটারটি মেমরিতে কীভাবে স্টাফ বরাদ্দ করে এবং পয়েন্টারটি কী তা যদি আপনি জেনে থাকেন তবে আমি উভয়ের পার্থক্যটি বোঝা সহজ হয়েছি।

রেফারেন্স সাধারণত পয়েন্টারের সাথে জড়িত। মেমরি ঠিকানাটির অর্থ যেখানে আপনার ভেরিয়েবলটি আসলে অন্য একটি মেমরি ঠিকানা ধারণ করে প্রকৃত অবজেক্টের মেমরি অবস্থানের সাথে ।

আমি যে উদাহরণটি দিতে যাচ্ছি তা হ'ল মারাত্মকভাবে সরলিকরণের চেয়ে বেশি, সুতরাং এটি একটি নুনের দানা দিয়ে নিন।

কম্পিউটার মেমরিটি একনাগাড়ে পিও বাক্সগুলির একগুচ্ছ কল্পনা করুন (ডাব্লু / পিও বক্স 0001 থেকে পিও বাক্স এন থেকে শুরু) যা এর ভিতরে কিছু রাখতে পারে। যদি পিও বাক্সগুলি এটি আপনার জন্য না করে তবে একটি হ্যাশটেবল বা অভিধান বা একটি অ্যারে বা অনুরূপ কিছু চেষ্টা করুন।

এইভাবে, আপনি যখন এমন কিছু করেন:

var a = "হ্যালো";

কম্পিউটার নিম্নলিখিতটি করবে:

  1. মেমরি বরাদ্দ করুন (5 বাইটের জন্য মেমরি অবস্থান 1000 দিয়ে শুরু করুন) এবং এইচ (1000 এ), ই (1001 এ), এল (1002 এ), এল (1003 এ) এবং ও (1004 এ) লাগান।
  2. মেমোরিতে কোথাও বরাদ্দ করুন (অবস্থানটি 0500 বলুন) এবং এটিকে ভেরিয়েবল হিসাবে নির্ধারণ করুন।
    সুতরাং এটি কোনওরকম একটি উপনামের মতো (0500 একটি)।
  3. সেই মেমোরি অবস্থানের (0500) থেকে 1000 এ মান নির্ধারণ করুন (যা মেমরিটিতে হ্যালো শুরু করে স্ট্রিং)। সুতরাং ভেরিয়েবল এ "হ্যালো" স্ট্রিংয়ের আসল শুরু মেমরি অবস্থানের একটি রেফারেন্স ধারণ করে ।

মান ধরণের প্রকৃত জিনিসটিকে তার মেমরির স্থানে ধরে রাখবে।

এইভাবে, আপনি যখন এমন কিছু করেন:

var a = 1;

কম্পিউটার নিম্নলিখিতটি করবে:

  1. একটি মেমরি লোকেশন বরাদ্দ করুন 0500 বলুন এবং এটিকে ভেরিয়েবল এ (একই উরফ জিনিস) হিসাবে বরাদ্দ করুন
  2. এর মধ্যে মান 1 রাখুন (মেমরি অবস্থান 0500 এ)।
    লক্ষ্য করুন যে আমরা আসল মান (1) ধরে রাখতে অতিরিক্ত মেমরি বরাদ্দ করছি না। সুতরাং একটি আসলে আসল মান ধারণ করে এবং এজন্য এটিকে মান ধরণ বলা হয়।


@ জন, আচ্ছা, এই ধরণেরটি আমি যা বলছিলাম তা অবৈধ করে। তবে আমি যেমন বলেছিলাম, দু'টি ধরণের মধ্যে কিছুটা বোঝার জন্য এটিকে চূড়ান্তভাবে প্রশস্ত করা হয়েছে যা আমার ক্ষেত্রে আমি সহায়ক বলে মনে করি। অন্তত আমি এটি মনের মধ্যে এটি চিত্রিত :)।
জিমি চন্দ্র

@ জোনস্কিট লিঙ্কটি মারা গেছে, আপনার কি কোনও কর্মক্ষম আছে?
21:55

4
@ এফএলনলোন: হ্যাঁ, এখানে একটি নতুন লিঙ্ক রয়েছে: ডকস.মাইক্রোসফটকম
জন স্কিইট

8

এটি প্রায় দুই বছর আগে, একটি অন্য ফোরামের আমার একটি পোস্টের। ভাষাটি vb.net থাকা অবস্থায় (সি # এর বিপরীতে), মান প্রকারের বনাম রেফারেন্স টাইপ ধারণাগুলি পুরো নেট .NET জুড়ে অভিন্ন এবং উদাহরণগুলি এখনও ধারণ করে।

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

উ: মানের প্রকারগুলি কেবল সেগুলি they এগুলি মেমরির একটি পৃথক ক্ষেত্রের প্রতিনিধিত্ব করে যেখানে একটি পৃথক ভ্যালু সংরক্ষণ করা হয়। মান প্রকারগুলি স্থির মেমরির আকারের এবং স্ট্যাকের মধ্যে সংরক্ষণ করা হয়, যা নির্দিষ্ট আকারের ঠিকানাগুলির সংগ্রহ।

আপনি যখন এর মতো বিবৃতি দেন:

Dim A as Integer
DIm B as Integer

A = 3
B = A 

আপনি নিম্নলিখিতগুলি করেছেন:

  1. 32 বিট পূর্ণসংখ্যার মান ধরে রাখার জন্য মেমরিতে 2 স্পেস তৈরি করা যথেষ্ট।
  2. এ এর জন্য বরাদ্দকৃত মেমরি বরাদ্দে 3 এর মান স্থাপন করে
  3. বি তে নির্ধারিত মেমরি বরাদ্দকৃত এটির সাথে একই মান নির্ধারণ করে 3 এর মান স্থাপন করে

প্রতিটি ভেরিয়েবলের মান প্রতিটি মেমরি লোকেশনে স্বতন্ত্রভাবে বিদ্যমান।

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

বলুন আপনি ক্লাস্পারসন নামের একটি ক্লাস তৈরি করেছেন, যার সাথে একটি স্ট্রিং প্রপার্টি পার্সন.নাম রয়েছে

এই ক্ষেত্রে, আপনি যখন কোনও বিবৃতি দেন:

Dim p1 As clsPerson
p1 = New clsPerson
p1.Name = "Jim Morrison"

Dim p2 As Person

p2 = p1

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

এখন এই পরিস্থিতি বিবেচনা করুন:

Dim p1 As clsPerson
Dim p2 As clsPerson

p1 = New clsPerson
p1.Name = "Jim Morrison"

p2 = p1

p2.Name = "Janis Joplin"

এই পরিস্থিতিতে, আপনি স্ট্যাকের পয়েন্টার পি 1 দিয়ে ম্যানেজড হিপ-এ ব্যক্তি শ্রেণীর একটি নতুন উদাহরণ তৈরি করেছেন যা বস্তুর উল্লেখ করে এবং বস্তুর নাম সম্পত্তি আবার "জিম মরিসন" এর মান নির্ধারিত করে। এরপরে, আপনি স্ট্যাকের মধ্যে আরেকটি পয়েন্টার পি 2 তৈরি করেছেন এবং এটি পি 1 দ্বারা রেফারেন্সযুক্ত ম্যানেজড হ্যাপের একই ঠিকানায় ইঙ্গিত করেছেন (যখন আপনি অ্যাসাইনমেন্টটি পি 2 = পি 1 করেছেন)।

এখানে আসে মোড়। আপনি যখন পি 2 এর নাম সম্পত্তিটি নির্ধারণ করবেন যখন "জেনিস জোপলিন" মানটি আপনি পি 1 এবং পি 2 উভয় দ্বারা রেফারেন্স করা বস্তুর জন্য নাম সম্পত্তি পরিবর্তন করছেন, যদি আপনি নিম্নলিখিত কোডটি চালিয়ে যান:

MsgBox(P1.Name)
'Will return "Janis Joplin"

MsgBox(p2.Name)
'will ALSO return "Janis Joplin"Because both variables (Pointers on the Stack) reference the SAME OBJECT in memory (an Address on the Managed Heap). 

এর কোনও মানে ছিল?

শেষ আপনি যদি এটি করেন:

DIm p1 As New clsPerson
Dim p2 As New clsPerson

p1.Name = "Jim Morrison"
p2.Name = "Janis Joplin"

আপনার কাছে এখন দুটি স্বতন্ত্র ব্যক্তি অবজেক্ট রয়েছে। তবে আপনি যে মিনিটটি আবার এটি করবেন:

p2 = p1

আপনি এখন উভয়কে "জিম মরিসন" -র দিকে নির্দেশ করেছেন। (পি 2 দ্বারা উল্লিখিত হিপজেক্টে অব হিপজেক্টের কী হয়েছিল তা আমি ঠিক নিশ্চিত নই। আমি মনে করি এটি এখন সুযোগের বাইরে চলে গেছে। এটি এমন একটি অঞ্চলের যেখানে আশাবাদী কেউ আমাকে সোজা করে দিতে পারে।)। - সম্পাদনা: আমি বিশ্বাস করি এই কারণেই আপনি নতুন অ্যাসাইনমেন্টটি করার আগে আপনি পি 2 = কিছুই বা পি 2 = নতুন ক্লাস্পারসন সেট করবেন না।

আবার যদি আপনি এখন এটি করেন:

p2.Name = "Jimi Hendrix"

MsgBox(p1.Name)
MsgBox(p2.Name)

দুটিই বাক্সবক্স এখন "জিমি হেন্ডরিক্স" ফিরিয়ে দেবে

এটি কিছুটা হলেও বিভ্রান্তিকর হতে পারে এবং আমি শেষবারের মতো একবার বলব, আমার কিছু বিবরণ ভুল থাকতে পারে।

শুভকামনা, এবং আশা করি আমার চেয়ে আরও ভাল যারা জানেন তারা এই বিষয়ে কিছু স্পষ্ট করতে সহায়তা করতে আসবেন। । ।


আপনি কেন কোনও আপ-ভোট পান নি তা আমি জানি না। ভাল উত্তর, পরিষ্কার এবং সহজ উদাহরণ দিয়ে আমাকে বুঝতে সাহায্য করেছে।
হ্যারি

ভ্যালু টাইপ বনাম হিসাবে, রেফারেন্স ধরণের ধারণাগুলি। নেট জুড়ে অভিন্ন , এগুলি আসলে কমন ল্যাঙ্গুয়েজ ইনফ্রাস্ট্রাকচার (সিএলআই) স্পেসিফিকেশন, একমা স্ট্যান্ডার্ড 335 (একটি আইএসও স্ট্যান্ডার্ড) এ সংজ্ঞায়িত করা হয়। । নেট এর স্ট্যান্ডার্ড অংশের জন্য এটি স্ট্যান্ডার্ড। একমা স্ট্যান্ডার্ড 334 (এছাড়াও একটি আইএসও স্ট্যান্ডার্ড) হ'ল সি # ভাষা এবং এটি স্পষ্টভাবে জানিয়েছে যে সি # বাস্তবায়নগুলি হয় হয় সি এল এল এর উপর নির্ভর করে বা এই সি # স্ট্যান্ডার্ড দ্বারা প্রয়োজনীয় ন্যূনতম সিএলআই বৈশিষ্ট্যগুলি পাওয়ার বিকল্প বিকল্পকে সমর্থন করে । ভিবি.নেট তবে মানক নয়, এটি মাইক্রোসফ্টের মালিকানাধীন।
ব্যবহারকারী 34660

5

মান ডেটা টাইপ এবং রেফারেন্স ডেটা টাইপ

1) মান (সরাসরি ডেটা ধারণ করে) তবে রেফারেন্স (ডেটা বোঝায়)

2) মূল্য (প্রতি পরিবর্তনশীল নিজস্ব কপি আছে) কিন্তু
রেফারেন্স (অধিক পরিবর্তনশীল কিছু বস্তু উল্লেখ করতে পারেন)

3) মান (অপারেশন ভেরিয়েবল অন্যান্য ভেরিয়েবলের উপর প্রভাব ফেলতে পারে না ) তবে রেফারেন্সে (ভেরিয়েবল অন্যকে প্রভাবিত করতে পারে)

4) মান প্রকারগুলি (int, bool, ভাসা) তবে রেফারেন্সের ধরণগুলি (অ্যারে, শ্রেণি অবজেক্ট, স্ট্রিং)


3

মান প্রকার:

  • স্থির মেমরি আকার।

  • স্ট্যাক স্মৃতিতে সঞ্চিত।

  • আসল মান ধরে।

    প্রাক্তন ইন্ট, চর, বুল ইত্যাদি ...

রেফারেন্স প্রকার:

  • স্থির স্মৃতি নয়।

  • হিপ মেমরিতে সঞ্চিত।

  • আসল মানটির মেমরি ঠিকানা ধারণ করে।

    প্রাক্তন স্ট্রিং, অ্যারে, ক্লাস, ইত্যাদি ...


1

"ভ্যারিয়েবলগুলি যা মান ধরণের উপর ভিত্তি করে থাকে সরাসরি মানগুলি ধারণ করে type একটি মান ধরণের ভেরিয়েবলকে অন্য মানকে অনুলিপি করে থাকে value এটি রেফারেন্স টাইপ ভেরিয়েবলের কার্যভার থেকে পৃথক, যা বস্তুর একটি রেফারেন্স অনুলিপি করে তবে অবজেক্টের নিজস্ব নয়" " মাইক্রোসফ্ট এর গ্রন্থাগার থেকে।

আপনি এখানে এবং এখানে আরও একটি সম্পূর্ণ উত্তর খুঁজে পেতে পারেন ।


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

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

ওহো নিশ্চিত ... এমএসডিএন ডকুমেন্টেশনের প্রচুর পরিমাণে বিট রয়েছে যেখানে সেখানে ত্রুটি পাওয়া যাবে :)
জন স্কিটে

1

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

সুতরাং আপনি যদি কোনও রেফারেন্স ভেরিয়েবল অনুলিপি করেন তবে আপনি কেবল মেমরির কোনও জায়গায় কোনও লিঙ্ক / পয়েন্টারটিকে একটি আসল ডেটাতে অনুলিপি করেন। যদি আপনি কোনও মান প্রকারের অনুলিপি করেন তবে আপনি মেমরির মধ্যে ডেটাটি সত্যই ক্লোন করেছেন।


0

এটি সম্ভবত রহস্যজনক উপায়ে ভুল, তবে এটি সহজ করার জন্য:

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

স্ট্রাক্টগুলি হ'ল মান প্রকার (ইনট, বুল ... স্ট্রাক্ট বা কমপক্ষে সিমুলেটেড ...), ক্লাসগুলি রেফারেন্স টাইপ।

মান.প্রকারগুলি সিস্টেম.ভ্যালু টাইপ থেকে অবতরণ করে। রেফারেন্সের ধরণটি সিস্টেম থেকে অবতরণ করুন।

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

সাধারণভাবে (.NET এর "ডিফল্ট" প্রয়োগে), মান ধরণ স্ট্যাকের (যদি তারা স্থানীয় ক্ষেত্র হয়) বা হিপগুলিতে (যদি তারা কোনও শ্রেণীর ক্ষেত্র হয়, যদি তারা পুনরুক্তি ফাংশনে পরিবর্তনশীল হয়, যদি এগুলি কোনও বন্ধের দ্বারা রেফারেন্সযুক্ত ভেরিয়েবল হয়, যদি তারা কোনও অ্যাসিঙ্ক ফাংশনে পরিবর্তনশীল হয় (নতুন অ্যাসিঙ্ক সিটিপি ব্যবহার করে ...)। রেফারেন্সযুক্ত মানটি কেবল স্তূপে যেতে পারে। রেফারেন্সগুলি মান ধরণের হিসাবে একই নিয়ম ব্যবহার করে।

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

এখন, আমি কীভাবে দীর্ঘ জিনিস লিখতে জানি না এবং আমার জীবনে আরও ভাল জিনিস করা উচিত। আপনি যদি "সুনির্দিষ্ট" "একাডেমিক" "সঠিক" সংস্করণ চান তবে এটি পড়ুন:

http://blogs.msdn.com/b/ericlippert/archive/2010/09/30/the-truth-about-value-types.aspx

আমি এটি 15 মিনিট খুঁজছি! এটি এমএসডিএন সংস্করণগুলির চেয়ে ভাল, কারণ এটি নিবিড় "ব্যবহারের জন্য প্রস্তুত" নিবন্ধ।


4
এটি রহস্যজনক উপায়ে বেশি ভুল। এটি মূলতঃ আমি ভুল বলতে চাই - কারণ রেফারেন্স ধরণের মানগুলি এখনও মান দ্বারা পাস হয়; এটি কেবলমাত্র মানটি কোনও রেফারেন্স, কোনও বস্তুর নয়। Pobox.com/~skeet/csharp/paraters.html দেখুন । ওহ, এবং স্থানীয় ভেরিয়েবলগুলি গাদাতেও শেষ হতে পারে, উদাহরণস্বরূপ যদি তারা ক্যাপচার হয় বা কোনও পুনরুক্তিকারী ব্লকের অংশ।
জন স্কিটি

ইটারেটর ব্লকগুলি ক্লাসে রূপান্তরিত হয়, সুতরাং "আপনার পিছনে" তারা "শ্রেণীর ক্ষেত্র"। বন্ধের জন্য একই। হ্যাঁ ... আমি "পয়েন্টার" (রেফারেন্স) এবং "পয়েন্ট" এর মধ্যে পার্থক্যটি লিখতে ভুলে গেছি
xanatos

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

@ জোন হ্যাঁ ... এগুলি তৃতীয় প্রকারের, কারণ পয়েন্টারগুলি নেট থেকে "অস্বচ্ছ" এবং সেগুলি মান টাইপ থেকে প্রাপ্ত হয় না। তবে এগুলি রেফারেন্সের চেয়ে মান প্রকারের সাথে বেশি মিল। আপনি এগুলি "রেফ" এবং "আউট" করতে পারেন। আমাকে জলে কাঁদতে হয়েছিল কারণ "কাউকে" পুনরাবৃত্তকারীদের কাজ করতে হবে p
xanatos

আমি এখন নিবন্ধটি দেখছি, আমি খুঁজে পেয়েছি: "তিন ধরণের মান রয়েছে: (1) মান ধরণের উদাহরণ, (2) রেফারেন্স ধরণের উদাহরণ এবং (3) রেফারেন্স। (সি # তে কোড হেরফের করতে পারে না রেফারেন্সের ধরণের উদাহরণগুলি সরাসরি; এটি সর্বদা একটি রেফারেন্সের মাধ্যমে এটি করে। অনিরাপদ কোডে পয়েন্টার প্রকারগুলি তাদের মানগুলির স্টোরেজ প্রয়োজনীয়তা নির্ধারণের উদ্দেশ্যে মান প্রকারের মতো বিবেচিত হয় )) "।
xanatos

0

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

ধরুন আমার কাছে এক্স এবং ওয়াই টাইপ কারের দুটি ভেরিয়েবল রয়েছে - একটি রেফারেন্স টাইপ। ওয়াই "অবজেক্ট আইডি # 19531" ধরে রাখে। যদি আমি "X = Y" বলি, এর ফলে এক্স "অবজেক্ট আইডি # 19531" ধরে রাখতে পারে। উল্লেখ্য, এক্স বা ওয়াই উভয়েরই গাড়ি নেই। অন্যথায় "অবজেক্ট আইডি # 19531" নামে পরিচিত গাড়িটি অন্য কোথাও সঞ্চিত রয়েছে। আমি যখন Y তে অনুলিপি করেছি, তখন আমি যা করেছি তা আইডি নম্বরটি অনুলিপি করছিলাম। এখন ধরুন আমি বলি এক্স। কালার = রঙ। ব্লু। এই জাতীয় বিবৃতিটি "অবজেক্ট আইডি # 19531" সন্ধান করার জন্য এবং এটি নীল রঙ করার নির্দেশ হিসাবে বিবেচিত হবে। উল্লেখ্য, যদিও এক্স এবং ওয়াই এখন হলুদ রঙের পরিবর্তে নীল রঙের গাড়িটিকে বোঝায়, বিবৃতিটি আসলে এক্স বা ওয়াইকে প্রভাবিত করে না, কারণ উভয়ই এখনও "অবজেক্ট আইডি # 19531" বোঝায়, যা এখনও এটির মতো গাড়ি সবসময় হয়েছে.


0

পরিবর্তনশীল প্রকার এবং রেফারেন্স মানটি প্রয়োগ করা সহজ এবং ডোমেন মডেলটিতে ভাল প্রয়োগ, বিকাশ প্রক্রিয়াটি সহজতর করে।

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

এই নিবন্ধটি পড়ুন পরিবর্তনশীল প্রকারের মান এবং সি # তে রেফারেন্স


এটি একটি ইংরেজী-কেবল প্রশ্নোত্তর সাইট, দুর্ভাগ্যক্রমে = \ \ উত্তর দেওয়ার চেষ্টা করার জন্য ধন্যবাদ। কেবলমাত্র সহায়তা হিসাবে লিঙ্কগুলি সহ সম্পূর্ণ উত্তরগুলি তৈরি করুন (তবে সম্পূর্ণ টেকসই উত্তর হিসাবে নয়)। কিভাবে উত্তর দিতে দয়া করে একবার দেখুন ।
জেসি

0

ধরা যাক vএকটি মান-ধরণের এক্সপ্রেশন / পরিবর্তনশীল এবং rএটি একটি রেফারেন্স-টাইপ এক্সপ্রেশন / পরিবর্তনশীল

    x = v  
    update(v)  //x will not change value. x stores the old value of v

    x = r 
    update(r)  //x now refers to the updated r. x only stored a link to r, 
               //and r can change but the link to it doesn't .

সুতরাং, একটি মান-ধরণের ভেরিয়েবল আসল মান (5, বা "এইচ") সঞ্চয় করে। একটি রেফারেন্স-টাইপ ভেরিয়েবল কেবল মানক যেখানে রূপক বাক্সে একটি লিঙ্ক সংরক্ষণ করে।


0

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

প্রতিটি ধরণের তথ্য রয়েছে যা সংকলক দ্বারা এক্সিকিউটেবল ফাইলের মধ্যে মেটাডেটা হিসাবে এম্বেড করা হবে যা মেমরির বরাদ্দকরণ এবং পুনরায় দাবি করার সময় টাইপ সুরক্ষার গ্যারান্টি হিসাবে সাধারণ ভাষা রানটাইম (সিএলআর) দ্বারা ব্যবহৃত হবে।

যদি আপনি জানতে চান যে কোনও নির্দিষ্ট ধরণের পরিমাণে কত মেমরি বরাদ্দ থাকে তবে আপনি আকার হিসাবে অপারেটরটি নিম্নরূপ ব্যবহার করতে পারেন:

static void Main()
{
    var size = sizeof(int);
    Console.WriteLine($"int size:{size}");
    size = sizeof(bool);
    Console.WriteLine($"bool size:{size}");
    size = sizeof(double);
    Console.WriteLine($"double size:{size}");
    size = sizeof(char);
    Console.WriteLine($"char size:{size}");
}

আউটপুট প্রতিটি ভেরিয়েবল দ্বারা বরাদ্দ করা বাইট সংখ্যা দেখায়।

int size:4
bool size:1
double size:8
char size:2

প্রতিটি ধরণের সম্পর্কিত তথ্য হ'ল:

  • প্রয়োজনীয় স্টোরেজ স্পেস।
  • সর্বাধিক এবং সর্বনিম্ন মান। উদাহরণস্বরূপ, টাইপ ইন্ট 32 এটি 2147483648 এবং 2147483647 এর মধ্যে মান গ্রহণ করে।
  • বেস টাইপটি যা থেকে উত্তরাধিকার সূত্রে প্রাপ্ত।
  • চলকগুলির জন্য মেমরিটি স্থানের সময় বরাদ্দ করা হবে।
  • যে ধরণের অপারেশন অনুমোদিত mitted
  • সদস্য দ্বারা (পদ্ধতি, ক্ষেত্র, ইভেন্ট, ইত্যাদি) টাইপ দ্বারা অন্তর্ভুক্ত। উদাহরণস্বরূপ, যদি আমরা টাইপ int এর সংজ্ঞাটি পরীক্ষা করি তবে আমরা নিম্নলিখিত কাঠামো এবং সদস্যগুলি খুঁজে পেতে পারি:

    namespace System
    {
        [ComVisible(true)]
        public struct Int32 : IComparable, IFormattable, IConvertible, IComparable<Int32>, IEquatable<Int32>
        {      
            public const Int32 MaxValue = 2147483647;     
            public const Int32 MinValue = -2147483648;
            public static Int32 Parse(string s, NumberStyles style, IFormatProvider provider);    
            ... 
        }  
    }
    

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

প্রতিটি প্রক্রিয়াতে, উপলব্ধ ভার্চুয়াল মেমরিটি নিম্নলিখিত 6 বিভাগে সংগঠিত হয়েছে তবে এই বিষয়টির প্রাসঙ্গিকতার জন্য, আমরা কেবল স্ট্যাক এবং হিপগুলিতে ফোকাস করব।

স্ট্যাক স্ট্যাকটি একটি লাইফো (সর্বশেষে, প্রথম আউট) ডেটা কাঠামো, অপারেটিং সিস্টেমের উপর একটি আকার-নির্ভরশীল (ডিফল্টরূপে, এআরএম, এক্স 86 এবং এক্স 64 মেশিনের জন্য উইন্ডোজ এর রিজার্ভ 1 এমবি, লিনাক্স 2MB থেকে 8MB উপর নির্ভর করে 8MB থাকে) সংস্করণ)।

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

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

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

স্ট্রাক কনস্ট্রাক্ট ব্যবহার করে কাস্টম টাইপের উদাহরণ হ'ল:

struct Point
{
    public int X;
    public int Y;
};

মান এবং রেফারেন্সের প্রকারগুলি আমরা সি # টাইপকে নিম্নলিখিত বিভাগগুলিতে শ্রেণিবদ্ধ করতে পারি:

  • মান ধরণের
  • রেফারেন্স প্রকার

মান ধরণের মান প্রকারগুলি সিস্টেম থেকে প্রাপ্ত। ভ্যালু টাইপ শ্রেণি এবং এই ধরণের ভেরিয়েবলগুলি স্ট্যাকের মধ্যে তাদের মেমরির বরাদ্দের মধ্যে তাদের মানগুলি ধারণ করে। মান ধরণের দুটি বিভাগ স্ট্রাক্ট এবং এনাম।

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

namespace System
{
    [ComVisible(true)]
    public struct Boolean : IComparable, IConvertible, IComparable<Boolean>, IEquatable<Boolean>
    {
        public static readonly string TrueString;
        public static readonly string FalseString;
        public static Boolean Parse(string value);
        ...
    }
}

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

চলাকালীন সময়ে, যখন কোনও রেফারেন্স ধরণের ভেরিয়েবল ঘোষণা করা হয়, এতে নতুন কীওয়ার্ড ব্যবহার করে তৈরি করা কোনও অবজেক্টের জন্য নির্ধারিত না হওয়া পর্যন্ত এর মানটি নাল থাকে।

নিম্নলিখিত উদাহরণটি জেনেরিক ধরণের তালিকার সদস্যদের দেখায়।

namespace System.Collections.Generic
{
    [DebuggerDisplay("Count = {Count}")]
    [DebuggerTypeProxy(typeof(Generic.Mscorlib_CollectionDebugView<>))]
    [DefaultMember("Item")]
    public class List<T> : IList<T>, ICollection<T>, IEnumerable<T>, IEnumerable, IList, ICollection, IReadOnlyList<T>, IReadOnlyCollection<T>
    {
        ...
        public T this[int index] { get; set; }
        public int Count { get; }
        public int Capacity { get; set; }
        public void Add(T item);
        public void AddRange(IEnumerable<T> collection);
        ...
    }
}

আপনি যদি কোনও নির্দিষ্ট অবজেক্টের মেমরি ঠিকানাটি খুঁজে পেতে চান তবে সিস্টেম.আরমানটাইম।আইএনটারপ সার্ভিসগুলি পরিচালনা না করা মেমরি থেকে পরিচালিত অবজেক্টগুলিতে অ্যাক্সেসের একটি উপায় সরবরাহ করে। নিম্নলিখিত উদাহরণে, আমরা স্ট্রিকের জন্য একটি হ্যান্ডেল বরাদ্দ করতে স্থির পদ্ধতি GCHandle.Alloc () ব্যবহার করব এবং এরপরে ঠিকানাটি পুনরুদ্ধার করার জন্য পদ্ধতিটি AddrOfPinnedObject।

string s1 = "Hello World";
GCHandle gch = GCHandle.Alloc(s1, GCHandleType.Pinned);
IntPtr pObj = gch.AddrOfPinnedObject();
Console.WriteLine($"Memory address:{pObj.ToString()}");

আউটপুট হবে

Memory address:39723832

রেফারেন্স অফিশিয়াল ডকুমেন্টেশন: https://docs.microsoft.com/en-us/cpp/build/references/stack-stack-allocations?view=vs-2019


-1

মান ধরণের এবং রেফারেন্স ধরণের মধ্যে পার্থক্যের অনেকগুলি অল্প বিশদ রয়েছে যা মান দ্বারা স্পষ্টভাবে বর্ণিত হয়েছে এবং তাদের মধ্যে কিছু বোঝা সহজ নয়, বিশেষত নবজাতকদের জন্য।

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

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

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

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