দ্রুত সারসংক্ষেপ
| বিষয় | ref | out |
| উদ্দেশ্য | এক্সিস্টিং ভেরিয়েবল মডিফাই করা (In/Out) | একাধিক আউটপুট রিটার্ন (Out-only) |
| ডিরেকশন | Bi-directional (ইনপুট + আউটপুট) | Uni-directional (শুধু আউটপুট) |
| ইনিশিয়ালাইজেশন (কলার) | বাধ্যতামূলক | প্রয়োজন নেই |
| ইনিশিয়ালাইজেশন (মেথড) | অপশনাল | বাধ্যতামূলক (সকল পাথে) |
| ওভারলোডিং | আলাদা সিগনেচার | আলাদা সিগনেচার |
ref উদাহরণ
using System;
public class Program {
public static void Change(ref int d) {
d = 11; // মূল ভেরিয়েবল পরিবর্তন
}
public static void Main() {
int c = 9; // ইনিশিয়ালাইজড থাকতে হবে
Change(ref c);
Console.WriteLine($"Changed value: {c}"); // 11
}
}
out উদাহরণ
public static void Update(out int a) {
a = 10; // বাধ্যতামূলক আসাইন
}
public static void Main() {
int b; // ইনিশিয়ালাইজ দরকার নেই
Update(out b);
Console.WriteLine($"Updated value: {b}"); // 10
}
ব্যবহারিক উদাহরণ: TryParse প্যাটার্ন
// out-এর ক্লাসিক ইউজকেস
public bool TryGetUser(int id, out User user) {
user = _db.Users.Find(id);
return user != null;
}
// কল
if (TryGetUser(123, out var user)) {
Console.WriteLine(user.Name);
}
ref vs out — রেফারেন্স টাইপের সাথে
class Person { public string Name; }
static void RefExample(ref Person p) {
p = new Person { Name = "New" }; // রেফারেন্স পরিবর্তন — কলারের ভেরিয়েবল এফেক্টেড
// p.Name = "Modified"; // অবজেক্ট মিউটেট — এটি ref ছাড়াও কাজ করত
}
static void OutExample(out Person p) {
p = new Person { Name = "Out" }; // বাধ্যতামূলক
}
static void Main() {
Person p1 = new Person { Name = "Original" };
RefExample(ref p1);
Console.WriteLine(p1.Name); // "New"
OutExample(out Person p2);
Console.WriteLine(p2.Name); // "Out"
}
in প্যারামিটার (C# 7.2+) — রিড-অনলি রেফারেন্স
// বড় স্ট্রাক্ট পাস করলে কপি এড়াতে
public readonly struct LargeStruct {
public long Data1, Data2, Data3, Data4, Data5;
}
static void Process(in LargeStruct data) {
// data = new LargeStruct(); // ❌ Compile error: read-only
Console.WriteLine(data.Data1);
}
// কল
var ls = new LargeStruct();
Process(in ls); // বা Process(ls) — in ইম্প্লিসিট
ref return / ref local (C# 7.0+)
static ref int FindMax(ref int x, ref int y) {
return ref (x > y ? ref x : ref y);
}
static void Main() {
int a = 10, b = 20;
ref int max = ref FindMax(ref a, ref b);
max = 30; // b আপডেট হবে (max হলো b-র রেফারেন্স)
Console.WriteLine(b); // 30
}
সেরা প্র্যাকটিস
- ডিফল্টভাবে value parameter ব্যবহার করুন (সafest)
out ব্যবহার করুন একাধিক রিটার্ন ভ্যালুর জন্য (TryParse প্যাটার্ন)
ref ব্যবহার করুন কম الأحيانে — কলোর ডিজাইন für mutation
in ব্যবহার করুন বড় readonly struct পাস করার জন্য
ref struct (C# 7.2+) স্ট্যাক-ওনলি টাইপের জন্য