7

कोई भी ref कीवर्ड के बिना निम्न कोड मानें, जो स्पष्ट रूप से वैरिएबल को प्रतिस्थापित नहीं करेगा, क्योंकि यह मान के रूप में पारित किया गया है।सी # में गुजरने वाले ऐरे पैरामीटर: संदर्भ के आधार पर यह स्पष्ट रूप से क्यों है?

class ProgramInt 
{ 
    public static void Test(int i) // Pass by Value 
    { 
     i = 2; // Working on copy. 
    } 

    static void Main(string[] args) 
    { 
     int i = 1; 
     ProgramInt.Test(i); 
     Console.WriteLine(i); 
     Console.Read(); 

     // Output: 1 
    } 
} 

अब जब कि समारोह काम कर के रूप में उम्मीद है करने के लिए, एक हमेशा की तरह ref कीवर्ड जोड़ सकते हैं:

class ProgramIntRef 
{ 
    public static void Test(ref int i) // Pass by Reference 
    { 
     i = 2; // Working on reference. 
    } 

    static void Main(string[] args) 
    { 
     int i = 1; 
     ProgramInt.Test(ref i); 
     Console.WriteLine(i); 
     Console.Read(); 

     // Output: 2 
    } 
} 

अब मैं क्यों सरणी सदस्यों के रूप में लाजवाब करना जब कार्यों परोक्ष द्वारा पारित कर रहे हैं में पारित कर रहा हूँ संदर्भ। सरणी मूल्य प्रकार नहीं हैं?

class ProgramIntArray 
{ 
    public static void Test(int[] ia) // Pass by Value 
    { 
     ia[0] = 2; // Working as reference? 
    } 

    static void Main(string[] args) 
    { 
     int[] test = new int[] { 1 }; 
     ProgramIntArray.Test(test); 
     Console.WriteLine(test[0]); 
     Console.Read(); 

     // Output: 2 
    } 
} 
+3

इसे विकी क्यों बनाते हैं? – jsmith

उत्तर

16

नहीं, सरणी कक्षाएं हैं, जिसका अर्थ है कि वे संदर्भ प्रकार हैं।

+0

आम तौर पर, आप किसी भी प्रकार का पता लगाने के लिए एफ 12 दबा सकते हैं। अगर घोषणा "वर्ग" कहती है, तो यह एक संदर्भ प्रकार है; अगर यह "संरचना" कहता है, तो यह एक मूल्य प्रकार है।दुर्भाग्य से, यह आपको सरणी के साथ ऐसा करने नहीं देता है, जो शर्म की बात है। तो आपको बस याद रखना होगा कि सरणी संदर्भ प्रकार हैं, भले ही यह मान प्रकार की सरणी हो। – Timwi

+0

साफ़ और संक्षिप्त, धन्यवाद। – Lazlo

+0

टिमवी ने जो कहा, उसे जोड़ने के लिए, एफ 12 विजुअल स्टूडियो के लिए हॉटकी है। –

1

क्या आप मूल्य के अनुसार 2 मिलियन तत्व सरणी पास करने की कल्पना कर सकते हैं? अब कल्पना करें कि तत्व प्रकार decimal है। आपको लगभग 240MB 30.5175781MB डेटा कॉपी करना होगा।

0

जैसा कि the MSDN reference द्वारा इंगित किया गया है, सरणी वस्तुएं हैं (सिस्टम.एरे सभी एरे का सार आधार प्रकार है) और ऑब्जेक्ट संदर्भ द्वारा पारित किए जाते हैं।

+3

मैं 'System.Array' का उल्लेख करने जा रहा था, लेकिन तब मुझे याद आया कि 'System.ValueType' और' System.Enum' संदर्भ प्रकार भी हैं, और फिर भी उन मान प्रकारों और enums जो तर्कसंगत रूप से उनसे प्राप्त होते हैं, नहीं हैं। – Timwi

2

Arrays संदर्भ द्वारा पारित नहीं किया गया है। सरणी के संदर्भ मूल्य से पारित होते हैं। यदि यह बदलना आवश्यक है कि व्हाट एरे को पास-इन सरणी चर बिंदुओं (जैसे सरणी के आकार को बदलने के लिए), चर को संदर्भ द्वारा पारित किया जाना चाहिए।

0

मूल डेटा प्रकारों के अलावा आप मूल्य से गुजरने के अलावा कुछ और नहीं पारित कर सकते हैं, ऐरे संग्रहित मूल्य के आधार पर गुजरने की अनुमति देने वाले मूल डेटा प्रकारों का संग्रह संग्रह की कई प्रतियां बनाएगा जो प्रदर्शन पर खराब होंगे।

+2

स्ट्रक्चर "मूल डेटा प्रकार" नहीं हैं और वे मूल्य से पारित होते हैं। –

2

एक अच्छा तरीका यह याद करने के लिए है:

  • "रेफरी" एक उर्फ ​​ के लिए बनाता है एक चर
  • एक सरणी चर के संग्रह है, प्रत्येक तत्व एक चर है।

जब आप सामान्य रूप से सरणी पास करते हैं, तो आप को चर का संग्रह पास कर रहे हैं। संग्रह में चर बदल नहीं है।

जब आप "रेफरी" के साथ एक सरणी पास करते हैं तो आप वेरिएबल को नया नाम दे रहे हैं जिसमें सरणी है।

जब आप एक सरणी तत्व को पार करते हैं तो आप वैरिएबल में मान पास कर रहे हैं।

जब आप एक सरणी तत्व पास करते हैं - एक चर - "रेफरी" के साथ, आप उस चर पर नया नाम दे रहे हैं।

समझ में आओ?

+0

मुझे व्यक्तिगत रूप से यह उपरोक्त पते पसंद है लेकिन अभी भी अधिकांश लोगों को यह नहीं मिलता है। यहां एक तरीका है जिसे मैंने कुत्ते का उपयोग एक समानता के रूप में वर्णित किया है लेकिन यह वास्तव में लंगड़ा लगता है: http://stackoverflow.com/questions/3366650/does-var-onload-mean-that-it-should-run-when-page -इस-लोड/3366783 # 3366783 – ChaosPandion

+0

व्यक्तिगत रूप से मुझे "नया नाम देने" का वाक्यांश पसंद नहीं है। किसी कारण से, यह सिर्फ मेरे साथ रिंग नहीं करता है। लेकिन मुझे नहीं पता कि नौसिखिया इसे कैसे समझेंगे। – Timwi