Parameter Array
params in C# – Optional Parameters in C#: सामान्यत: किसी Method में हम उतने ही Parameters Pass कर सकते हैं, जितने Method Accept कर सकता है। लेकिन C# हमें params Keyword के साथ Parameters का एक Array Specify करने की सुविधा भी Provide करता है, जिससे Method को Call करते समय हमे उस Method में Variable Number of Arguments Pass करने की सुविधा मिल जाती है। Parameter Array को Use करते समय हमें निम्न बातों को ध्यान में रखना जरूरी होता है:
- एक Method Definition की Parameter List में केवल एक ही Parameter Array हो सकता है।
- यदि किसी Method Definition की Parameter List में Parameter Array हो, तो वह Parameter List का अन्तिम Parameter होना चाहिए।
- Parameter Array द्वारा केवल एक ही प्रकार के Parameter को Represent किया जा सकता है।
Parameter Array Specify करने के लिए हमें Method Definition के समय Parameter Array के Data Type से पहले params Keyword व Data Type के बाद एक Opening-Closing Bracket Pair को Specify करना होता है और अन्त में Parameter का नाम Specify करना होता है। जैसे:
void ListInts( params int[ ] intVals )
{
. . .
}
Bracket का Empty Pair Compiler को इस बात का Indication देता है कि Current Parameter एक Array है।
एक Array समान प्रकार के Data Items का एक एक Ordered Set होता है, जिसके हर Item को Element कहा जाता है तथा हर Element के साथ एक Zero Based Index Number Associated रहता है, जिसका प्रयोग किसी Particular Element को Access व Manipulate करने के लिए किया जाता है। साथ ही C# में Array एक Reference Type होता है, इसलिए Array के सभी Elements Memory के Heap Area में ही Store होते हैं।
Parameter Array को Create करने के बाद Method Invoke करते समय हम इस प्रकार के Parameter Array वाले Method को कई तरह के Arguments Pass करते हुए Invoke कर सकते हैं।
यानी हम Values को एक Comma Separated List के रूप में Specify करते हुए Method को Call कर सकते हैं। जैसे:
ListInts( 10, 201, 302, 45 ) ;
अथवा हम Values का एक Array Create करके उस Array को Parameter की तरह Called Method में Pass कर सकते हैं। जैसे:
int[] paramArray = { 10, 201, 302, 45 };
ListInts(paramArray);
साथ ही Parameter Array के params Modifier को केवल तभी उपयोग में लेना होता है, जब हम Method को Define करते हैं। Method को Invoke करते समय हमें params Keyword को Use करने की जरूरत नहीं होती।
जैसाकि हमने पहले कहा कि Parameter Array का उपयोग करने पर हम एक ही Method में एक से ज्यादा Parameters को Comma Separated Values की तरह अथवा Values के Array की तरह Pass कर सकते हैं। इसलिए एक ही Method को हम कई तरीकों से Variable Number of Parameters Pass करके Call कर सकते हैं और एक ही Method को कई तरीकों से उपयोग में ले सकते हैं। इसे Use करने की प्रक्रिया को हम निम्नानुसार उदाहरण Program द्वारा बेहतर तरीके से समझ सकते हैं:
// File Name: ParameterArray.cs using System; namespace CSharpIntermediateConstructsMethod { class ParameterArray { private static void Main(string[] args) { Console.WriteLine("12+32+11 = {0}", AddList(12, 32, 11)); Console.WriteLine("102+132 = {0}", AddList(102, 132)); Console.WriteLine("100 = {0}", AddList(100)); Console.WriteLine("Parameter = {0}", AddList()); int[] values = { 12, 32, 11 }; Console.WriteLine("12+32+11 = {0}", AddList(values)); } static int AddList(params int[] intVals) { int sum = 0; for (int i = 0; i < intVals.Length; i++) sum = sum + intVals[i]; return sum; } } } // Output: 12+32+11 = 55 102+132 = 234 100 = 100 Parameter = 0 12+32+11 = 55
जैसाकि इस Program में Output द्वारा हम समझ सकते हैं कि Parameter Array Specify करने के बाद किस तरह से हम एक ही Method को अलग-अलग संख्या में Parameters Pass करके अलग-अलग Output प्राप्त कर सकते हैं।
Array as Value and Reference Parameter
चूंकि Array भी एक प्रकार का Secondary Data Type या Reference Type ही होता है, इसलिए जिस तरह से हम किसी Method में Argument के रूप में Primary Data Type के मानों को Parameter के रूप में Pass कर सकते हैं, उसी तरह से हम किसी Secondary Data Type के मानों को भी Parameter के रूप में Pass कर सकते हैं।
हालांकि Array स्वयं समान प्रकार के बहुत सारे Data Items का Collection होता है, लेकिन Array में Stored Items Value Type Data भी हो सकते हैं और Reference Type Data भी। साथ ही स्वयं Array को भी Value Type अथवा Reference Type की तरह Method में Parameter की तरह Pass किया जा सकता है।
जब Array Parameter को Value Type Parameter की तरह Method में Pass किया जाता है, तब भी Array वास्तव में Heap Area में Stored Data Elements के Set को ही Refer कर रहा होता है और Called Method में Create होने वाले नए Array में केवल Called Method से आने वाले Array का Reference ही Copy होता है।
इसलिए यदि Called Method में Parameter की तरह आने वाले Reference को Hold करने वाले Array में किसी अन्य Array का Reference Store कर दिया जाए, तब भी Calling Method का Array किसी अन्य Heap Area को Refer नहीं करेगा। जैसे:
File Name: ParameterArrayAsValue.cs using System; namespace CSharpIntermediateConstructsMethod { class ParameterArrayAsValue { private static void Main(string[] args) { int[] valArray = { 10, 20 }; Console.WriteLine("Before Method Call: val1: {0} \t val2: {1}", valArray[0], valArray[1]); AddList(valArray); Console.WriteLine("After Method Call: val1: {0} \t val2: {1}", valArray[0], valArray[1]); } static void AddList(int[] intVals) { int[] newArray = { 12, 32,}; intVals = newArray; } } } // Output: Before Method Call: val1: 10 val2: 20 After Method Call: val1: 10 val2: 20
जैसाकि उपरोक्त Program के Output द्वारा हम समझ सकते हैं कि AddList() Method को Call करने के बावजूद Main() Method के Array के Elements के Data में कोई परिवर्तन नहीं होताए जिसका मतलब यही है कि Main() Method का valArray, Method को Call करने से पहले जिस Heap Area को Refer कर रहा था, Method को Call करने के बाद भी उसी Heap Area को Refer कर रहा है।
जबकि AddList Method के अन्दर हमने Parameter के रूप में Pass किए गए इसी Array के Reference को intVals नाम के नए Array में प्राप्त किया है और फिर newArray नाम का नया Array Create करके उसका Reference को intVals नाम के Parameter Array को Specify कर दिया है, जिसकी वजह से intVals नाम का Parameter Array अब एक नए Heap Area को Refer करने लगा है।
Called Method में intVals के किसी दूसरे Heap Area को Refer करने के बावजूद Calling Method का valArray नए Heap Area का Refer नहीं करताए क्योंकि Called Method में Pass किए जाने वाले Array को हमने By Value Pass किया है।
लेकिन यदि हम इसी Program को निम्नानुसार Modify कर दें व Parameter के रूप में Pass किए जाने वाले Method को By Reference Send करने के लिए ref Keyword का प्रयोग करें, तो Called Method द्वारा किए जाने वाले Changes का Effect, Calling Method के Array पर भी पडता है। जैसे:
// File Name: ParameterArrayAsValue.cs using System; namespace CSharpIntermediateConstructsMethod { class ParameterArrayAsValue { private static void Main(string[] args) { int[] valArray = { 10, 20 }; Console.WriteLine("Before Method Call: val1: {0} \t val2: {1}", valArray[0], valArray[1]); AddList(ref valArray); Console.WriteLine("After Method Call: val1: {0} \t val2: {1}", valArray[0], valArray[1]); } static void AddList(ref int[] intVals) { int[] newArray = { 12, 32,}; intVals = newArray; } } } // Output: Before Method Call: val1: 10 val2: 20 After Method Call: val1: 12 val2: 32
इस Program में हमने Array को एक Reference Value की तरह Called Method में Pass किया है, इसलिए intVals व valArray दोनों समान Heap Area Data को ही Represent करते हैं।
अत: जब Called Method में intVals को एक नया Array Assign किया जाता है, तो Called Method के valArray को भी वही नया Array Assign हो जाता है। इसलिए Called Method के Array के Data Members का मान भी Change हो जाता है।
इसी तरह से यदि हम ref Keyword के स्थान पर out Keyword का प्रयोग करके Program को फिर से Modify कर दें, तब भी Called Method द्वारा Parameter Array पर किए जाने वाले Changes का प्रभाव Calling Method के Array पर भी पडता है।
चूंकि, C# में Array एक Reference Type होता है। इसलिए यदि Called Method द्वारा Array के Elements के मान को Change किया जाता है, तो Calling Method के उसी Array के Elements का मान भी Change हो जाता है।
जब हम किसी Reference Type को Called Method में Parameter की तरह Pass करते हैं, तब हमें एक बात विशेष रूप से ध्यान रखनी होती है कि सभी Reference Type हमेंशा Heap Area में Stored Data को Refer करते हैं। साथ ही सभी Reference Type एक या एक से अधिक Data के Collection को Represent करते हैं। इसलिए Reference Type द्वारा Represented Data व स्वयं Reference Type, दो अलग Concepts होते हैं।
इसलिए यदि हम किसी Called Method में किसी भी Reference Type के माध्यम से Data को Modify करते हैं, तो Called Method के Data भी Change होते हैं, क्योंकि Calling Method व Called Method, दोनों ही समान Heap Area Data को Refer करते हैं, लेकिन जब हम किसी भी Reference Type को Called Method में By Value Pass करते हैं, तब Calling Method के Reference Type की Copy, Called Method में Create होने वाले Reference Type में हो जाती है।
इसलिए अब यदि Called Method में Parameter के रूप में आने वाले Reference Type के Reference को Change कर दिया जाए, तो इस Change का प्रभाव Calling Method के Reference Type के Reference पर नहीं पडता और Calling Method का Reference Type उसी Heap Area को Reference करता रहता है, जिसे Method को Call करने से पहले कर रहा था।
लेकिन जब Reference Type को By Ref Pass किया जाता है, तब Calling Method के Reference Type की Copy, Called Method में Create होने वाले Reference Type में नहीं होती, बल्कि Called Method में Create होने वाला नया Reference Type उसी Heap Area को Refer करता है, जिसे Calling Method का Reference Type करता है।
परिणामस्वरूप By Ref आने वाले Reference Type Parameter के Reference को Called Method के अन्दर Change करने का प्रभाव Calling Method के Reference Type पर भी पडता है और Calling Method भी उसी नए Heap Area को Refer करने लगता है, जिसे Called Method में Assign किया गया होता है। (params in C# – Optional Parameters in C#)
ये Article इस वेबसाईट पर Selling हेतु उपलब्ध EBook C#.NET in Hindi से लिया गया है। इसलिए यदि ये Article आपके लिए उपयोगी रहा, तो निश्चित रूप से ये पुस्तक भी आपके लिए काफी उपयोगी साबित होगी।
C#.NET in Hindi | Page:908 | Format: PDF