মূল পার্থক্য: Reference Type vs Value Type
| বিষয় | Class (Reference Type) | Struct (Value Type) |
| মেমরি অ্যালোকেশন | হিপ (Heap) | স্ট্যাক (Stack) বা ইনলাইন (containing type-এ) |
| অ্যাসাইনমেন্ট | রেফারেন্স কপি (দুই ভেরিয়েবল একই অবজেক্ট) | ভ্যালু কপি (দুটি আলাদা কপি) |
| Null হতে পারে? | হ্যাঁ | না (সাধারণত), Nullable<T> দিয়ে হয় |
| ডিফল্ট ভ্যালু | null | সব ফিল্ড ০/null/false |
| ইনহেরিট্যান্স | সাপোর্ট করে (বেস ক্লাস হতে পারে) | না (ইনহেরিট করতে পারে না, কিন্তু ইন্টারফেস ইমপ্লিমেন্ট করতে পারে) |
| Protected মডিফায়ার | সাপোর্ট করে | না |
| ডিস্ট্রাক্টর/ফাইনালাইজার | হ্যাঁ | না |
| new দিয়ে ইনস্ট্যান্স | বাধ্যতামূলক (রেফারেন্স টাইপের জন্য) | অপশনাল (লিখলে বা না লিখলেই চলে) |
| ইন্টারফেস ইমপ্লিমেন্ট | হ্যাঁ | হ্যাঁ |
| বক্সিং/আনবক্সিং | না (রেফারেন্স টাইপ) | হ্যাঁ (ইন্টারফেস/Object-এ キャスト করলে) |
Class উদাহরণ
public class Person {
public string Name { get; set; }
public int Age { get; set; }
// কনস্ট্রাক্টর
public Person(string name, int age) {
Name = name;
Age = age;
}
// ডিস্ট্রাক্টর
~Person() { Console.WriteLine("Person finalized"); }
}
var p1 = new Person("John", 30);
var p2 = p1; // রেফারেন্স কপি
p2.Name = "Jane";
Console.WriteLine(p1.Name); // Jane (একই অবজেক্ট!)
Struct উদাহরণ
public struct Point {
public int X { get; set; }
public int Y { get; set; }
// Struct-এ প্যারামিটারহীন কনস্ট্রাক্টর লিখা যায় না (C# 10 전까지)
// কিন্তু C# 10+ এ লিখা যায়
public Point(int x, int y) {
X = x; Y = y;
}
}
var pt1 = new Point(10, 20);
var pt2 = pt1; // ভ্যালু কপি (নতুন কপি)
pt2.X = 100;
Console.WriteLine(pt1.X); // 10 (অপরিবর্তিত!)
Console.WriteLine(pt2.X); // 100
কোনটি কখন ব্যবহার করবেন?
✅ Class ব্যবহার করুন যখন:
- আইডেন্টিটি গুরুত্বপূর্ণ (দুটি অবজেক্ট একই ডেটা হলেও আলাদা)
- বড় অবজেক্ট (মেমরি কপি খরচবহুল)
- ইনহেরিট্যান্স দরকার
- নালেবল রেফারেন্স সেমান্টিক্স দরকার
- পলিমরফিজম ব্যবহার করবেন
✅ Struct ব্যবহার করুন когда:
- ছোট, সিম্পল ডেটা কন্টেইনার (Point, DateTime, Guid, Color)
- ভ্যালু সেমান্টিক্স (কপি = নতুন মান)
- অ্যারে/লিস্টে লক্ষ লক্ষ এলিমেন্ট রাখলে (হিপ অ্যালোকেশন এড়াতে)
- হাই-পারফরম্যান্স, লো-ল্যাটেন্সি কোড
- ইমিউটেবল ডিজাইন (C# 7.2+
readonly struct)
মডার্ন C# স্ট্রাক্ট ফিচারস
// Readonly struct (C# 7.2+) — ইমিউটেবল গ্যারান্টি
public readonly struct Point3D {
public double X { get; init; }
public double Y { get; init; }
public double Z { get; init; }
public Point3D(double x, double y, double z) {
X = x; Y = y; Z = z;
}
}
// Ref struct (C# 7.2+) — শুধু স্ট্যাক, হিপে যেতে পারবে না
public ref struct SpanWrapper {
public Span<byte> Data;
}
// Record struct (C# 10+) — ভ্যালু টাইপ রেকর্ড
public record struct PersonRecord(string Name, int Age);
সতর্কতা
- Struct-কে মেথড প্যারামিটার হিসেবে পাস করলে কপি হয় — বড় স্ট্রাক্টের জন্য
in, ref, out ব্যবহার করুন
- বক্সিং এড়াতে জেনেরিক কনস্ট্রেইন্ট
where T : struct বা ইন্টারফেস এড়িয়ে চলুন
- Mutable struct আপদাত্বক (ব্যাগের স্রষ্টা) —
readonly struct বা init প্রপার্টি ব্যবহার করুন