C# में मेथड पैरामीटर्स पास करना
C# डिफ़ॉल्ट रूप से **वैल्यू द्वारा पासिंग (Pass by Value)** करता है: मेथड को आर्गुमेंट की **कॉपी** मिलती है। मूल वेरिएबल अपरिवर्तित रहता है। रेफरेंस टाइप्स के लिए, रेफरेंस की कॉपी पास होती है (ऑब्जेक्ट नहीं)।
पैरामीटर पासिंग मोड्स
| मोड | कीवर्ड | विवरण | उदाहरण |
|---|---|---|---|
| वैल्यू द्वारा (डिफ़ॉल्ट) | (कोई नहीं) | वैल्यू की कॉपी पास होती है | void M(int x) |
| रेफरेंस द्वारा | ref | वेरिएबल का रेफरेंस पास होता है (पढ़/लिख) | void M(ref int x) |
| आउटपुट पैरामीटर | out | मेथड को वेरिएबल असाइन करना आवश्यक | void M(out int x) |
| इनपुट-ओनली रेफरेंस | in | रीड-ओनली रेफरेंस (C# 7.2+) | void M(in int x) |
| पैरामीटर एरे | params | वेरिएबल संख्या में आर्गुमेंट्स | void M(params int[] xs) |
उदाहरण: वैल्यू द्वारा पासिंग (डिफ़ॉल्ट)
using System;
class NumberManipulator {
public void Swap(int x, int y) {
int temp = x;
x = y;
y = temp;
// केवल लोकल कॉपीज बदलीं
}
}
class Program {
static void Main() {
NumberManipulator n = new NumberManipulator();
int a = 50, b = 150;
Console.WriteLine($"Before: a={a}, b={b}"); // 50, 150
n.Swap(a, b);
Console.WriteLine($"After: a={a}, b={b}"); // 50, 150 (अपरिवर्तित!)
}
}
आउटपुट
Before: a=50, b=150 After: a=50, b=150
ref के साथ स्वैप (काम करता है)
public void SwapRef(ref int x, ref int y) {
int temp = x; x = y; y = temp;
}
// कॉल
n.SwapRef(ref a, ref b);
Console.WriteLine($"After ref swap: a={a}, b={b}"); // 150, 50
out पैरामीटर (मल्टीपल रिटर्न वैल्यूज के लिए)
public bool TryParseInt(string s, out int result) {
return int.TryParse(s, out result);
}
// कॉल
if (TryParseInt("123", out int value)) {
Console.WriteLine(value); // 123
}
in पैरामीटर (बड़े स्ट्रक्चर्स के लिए प्रदर्शन)
// बड़ा स्ट्रक्चर कॉपी किए बिना पास करें
public void Process(in LargeStruct data) {
// data रीड-ओनली; असाइनमेंट कंपाइल एरर
Console.WriteLine(data.SomeField);
}
रेफरेंस टाइप्स के साथ व्यवहार
class Person { public string Name; }
void ChangeName(Person p) {
p.Name = "Changed"; // ऑब्जेक्ट म्यूटेट होता है (रेफरेंस कॉपी)
p = new Person(); // लोकल रेफरेंस बदला, मूल नहीं
}
Person person = new Person { Name = "Original" };
ChangeName(person);
Console.WriteLine(person.Name); // "Changed" - ऑब्जेक्ट बदल गया!
सारांश
- वैल्यू टाइप्स (int, struct): डिफ़ॉल्ट = कॉपी। बदलने के लिए
ref/out। - रेफरेंस टाइप्स (class): डिफ़ॉल्ट = रेफरेंस कॉपी। ऑब्जेक्ट म्यूटेट हो सकता है; रीअसाइनमेंट कॉलर को प्रभावित नहीं करता।
refसे रीअसाइनमेंट संभव। - in: बड़े स्ट्रक्चर्स के लिए रीड-ओनली रेफरेंस (कॉपी बचाता है)।