সি # তে উপলব্ধ বিভিন্ন ডেটা ধরণের ব্যাখ্যা দেওয়ার আগে, এটি উল্লেখ করা গুরুত্বপূর্ণ যে সি # একটি দৃ 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