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

C#-তে মেথড প্যারামিটারের প্রকারভেদ: Value, Ref, Out

C#-তে মেথডে প্যারামিটার পাস করার তিনটি প্রধান উপায় রয়েছে:

১. Value Parameter (ডিফল্ট)

  • আর্গুমেন্টের মান কপি হয় প্যারামিটারে
  • মেথডের ভিতরে পরিবর্তন করলে মূল ভেরিয়েবল প্রভাবিত হয় না
  • প্রাইমিটিভ টাইপ (int, double, bool, struct) ডিফল্টভাবে ভ্যালু টাইপ

static void ValueParameter(int x, int y) {
    x = 10; y = 10; // লোকাল কপি পরিবর্তন
    Console.WriteLine($"Inside: x={x}, y={y}"); // 10, 10
}

static void Main() {
    int x = 5, y = 5;
    Console.WriteLine($"Before: x={x}, y={y}"); // 5, 5
    ValueParameter(x, y);
    Console.WriteLine($"After: x={x}, y={y}");  // 5, 5 (অপরিবর্তিত)
}

২. Reference Parameter (ref)

  • আর্গুমেন্টের মেমরি রেফারেন্স পাস হয়
  • মেথডের ভিতরে পরিবর্তন করলে মূল ভেরিয়েবল পরিবর্তন হয়
  • কলিং টাইমে ভেরিয়েবল ইনিশিয়ালাইজড থাকতে হবে
  • অবজেক্ট (রেফারেন্স টাইপ) ডিফল্টভাবে রেফারেন্স পাস হয়, কিন্তু ref দিলে রেফারেন্সের রেফারেন্স পাস হয় (রি-অ্যাসাইন সম্ভব)

static void RefParameter(ref int x, ref int y) {
    x = 10; y = 10;
    Console.WriteLine($"Inside: x={x}, y={y}"); // 10, 10
}

static void Main() {
    int x = 5, y = 5;
    Console.WriteLine($"Before: x={x}, y={y}"); // 5, 5
    RefParameter(ref x, ref y);
    Console.WriteLine($"After: x={x}, y={y}");  // 10, 10 (পরিবর্তিত!)
}

৩. Output Parameter (out)

  • ref-এর মতো রেফারেন্স পাস হয়
  • কলিং টাইমে ভেরিয়েবল ইনিশিয়ালাইজড থাকতে হবে না
  • মেথড বাধ্যতামূলকভাবে আউটপুট প্যারামিটারে মান আসাইন করতে হবে
  • একাধিক রিটার্ন ভ্যালু ফেরত দেওয়ার জন্য আদর্শ

static void OutParameter(out int result) {
    int x = 10, y = 10;
    result = x + y; // বাধ্যতামূলক আসাইনমেন্ট
}

static void Main() {
    int result; // ইনিশিয়ালাইজ দরকার নেই
    OutParameter(out result);
    Console.WriteLine($"Result: {result}"); // 20
}

তুলনা সারসংক্ষেপ

বিষয়Value (Default)refout
দিকIn (ইনপুট)In/Out (দুইদিক)Out (আউটপুট)
ইনিশিয়ালাইজেশনপ্রয়োজনপ্রয়োজনপ্রয়োজন নেই
মেথডে আসাইনমেন্টঅপশনালঅপশনালবাধ্যতামূলক
মূল ভেরিয়েবল পরিবর্তননাহ্যাঁহ্যাঁ
ওভারলোডিংভিন্ন সিগনেচারভিন্ন সিগনেচারভিন্ন সিগনেচার

রেফারেন্স টাইপের সাথে ref/out


class Person { public string Name; }

static void ChangeRef(ref Person p) {
    p = new Person { Name = "New" }; // রেফারেন্স পরিবর্তন — মূলেও ফিক্স
}

static void ChangeNoRef(Person p) {
    p = new Person { Name = "New" }; // লোকাল রেফারেন্স পরিবর্তন — মূলেও নয়
    p.Name = "Modified"; // কিন্তু অবজেক্ট মিউটেট করলে মূলেও ফিক্স
}

C# 7.0+ আউট ভেরিয়েবল ডিক্লেয়ারেশন


// পুরানো
int result;
Method(out result);

// নতুন — ইনলাইন ডিক্লেয়ারেশন
Method(out int result);
Console.WriteLine(result);

in প্যারামিটার (C# 7.2+)

  • readonly ref — শুধু রিড, মডিফাই করা যায় না
  • বড় স্ট্রাক্ট পাস করার জন্য কপি এড়াতে ব্যবহৃত হয়
  • void Method(in LargeStruct data)
  1. জাভা ৯-এ মডিউলের বিভিন্ন টাইপ কী কী?

  2. পাইথনে বিভিন্ন ধরনের বিটওয়াইজ অপারেটর কী কী?

  3. পাইথনে বিভিন্ন ধরনের আইডেন্টিটি অপারেটর কী কী?

  4. পাইথনে বিভিন্ন ধরনের কোটেশন কী কী?