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

C#-তে out এবং ref কীওয়ার্ডের পার্থক্য

দ্রুত সারসংক্ষেপ

বিষয়refout
উদ্দেশ্যএক্সিস্টিং ভেরিয়েবল মডিফাই করা (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+) স্ট্যাক-ওনলি টাইপের জন্য
  1. C#-এ TrimStart() এবং TrimEnd() মেথডের পার্থক্য

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

  3. Go এবং Java-এর পার্থক্য

  4. জাভাতে volatile এবং transient কিওয়ার্ডের পার্থক্য