কম্পিউটার টিউটোরিয়াল

C#-তে Class এবং Structure-এর পার্থক্য

মূল পার্থক্য: 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 প্রপার্টি ব্যবহার করুন
  1. C#-এ ক্লাস (Class) এবং স্ট্রাকচার (Structure) এর পার্থক্য

  2. জাভাতে String এবং StringBuffer ক্লাসের পার্থক্য

  3. জাভাতে Static এবং Final কীওয়ার্ডের পার্থক্য

  4. জাভাতে ক্লাস এবং ইন্টারফেসের পার্থক্য