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) | ref | out |
|---|---|---|---|
| দিক | 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)