Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C#

सी # में रेफरी, आउट और कीवर्ड में क्या उपयोग है?

सी # में, अधिकांश विधियों में शून्य या अधिक पैरामीटर हो सकते हैं जो उस डेटा को परिभाषित करते हैं जो विधि को प्रदान किया जाना चाहिए। विधि को कॉल करने वाले किसी भी कोड को विधि में डेटा (तर्क कहा जाता है) पास करना होता है। एक विधि अपने इनपुट को पैरामीटर के रूप में घोषित करती है, और वे तर्कों के रूप में कोड को कॉल करके प्रदान की जाती हैं।

उदाहरण के लिए, निम्न विधि और अनुवर्ती विधि कॉल पर विचार करें।

static void Greet(string greeting){
   Console.WriteLine(greeting);
}
...
Greet("Hello");

ऊपर के उदाहरण में, ग्रीटिंग ग्रीटिंग () विधि का एक पैरामीटर है, और "हैलो" विधि को दिया गया एक तर्क है।

जब आप एक विधि को कॉल करते हैं और तर्कों को पास करते हैं, तो वे मूल्य से पारित हो जाते हैं, जिसका अर्थ है कि विधि में पारित होने पर मूल्य की एक प्रति बनाई जाती है। विधि के अंदर तर्क में किए गए कोई भी परिवर्तन मूल चर पर प्रतिबिंबित नहीं होते हैं।

using System;
int number = 8;
Increase(number);
Console.WriteLine(number); // prints 8
static void Increase(int num){
   num = num + 1;
   Console.WriteLine(num); // prints 9
}

जब आप एक संदर्भ प्रकार चर, जैसे कोई ऑब्जेक्ट पास करते हैं, तो C# अभी भी संदर्भ . की प्रतिलिपि बनाता है मूल्य से, क्योंकि चर संदर्भ रखता है, वास्तविक वस्तु नहीं। इसलिए भले ही संदर्भ चर की एक प्रति पास की गई हो, दोनों स्मृति में एक ही वस्तु को संदर्भित करते हैं। इसलिए मेथड के अंदर वेरिएबल द्वारा ऑब्जेक्ट में किया गया कोई भी बदलाव मेथड के बाहर वेरिएबल को दिखाई देता है।

using System;
var john = new User{
   Name = "John",
   Salary = 50000
};
Promote(john);
Console.WriteLine(john.Salary); // prints 60000
static void Promote(User u){
   u.Salary += 10000;
   Console.WriteLine(u.Salary); // prints 60000
}

हालाँकि, यदि आप विधि के अंदर ही चर के मान को बदलते हैं, तो वह परिवर्तन विधि के बाहर परिलक्षित नहीं होता है, क्योंकि केवल एक प्रति बदली गई थी, वास्तविक वस्तु नहीं। उदाहरण के लिए, हम तर्क को विधि के अंदर शून्य करने के लिए असाइन कर सकते हैं, और वास्तविक चर अपरिवर्तित रहेगा।

using System;
var john = new User{
   Name = "John",
   Salary = 50000
};
Promote(john);
Console.WriteLine(john.Salary); // prints 50000
static void Promote(User u){
   u = null;
}

C# तीन अलग-अलग संशोधक कीवर्ड की अनुमति देता है जिनके उपयोग से आप विधियों के मापदंडों को नियंत्रित कर सकते हैं।

रेफरी संशोधक

C# आपको रेफरी . का उपयोग करके संदर्भ द्वारा पैरामीटर पास करने की अनुमति देता है संशोधक इससे कोई फर्क नहीं पड़ता कि पारित होने वाला चर किसी संदर्भ प्रकार या मान प्रकार से संबंधित है या नहीं। पैरामीटर और तर्क दोनों एक ही मेमोरी लोकेशन को संदर्भित करेंगे।

निम्नलिखित उदाहरण में, तर्क u को शून्य पर सेट करने से भी जॉन चर शून्य हो जाएगा, जिससे शून्य संदर्भ अपवाद हो जाएगा।

उदाहरण

using System;
var john = new User{
   Name = "John",
   Salary = 50000
};
Promote(ref john);
Console.WriteLine(john.Salary); // throws System.NullReferenceException
static void Promote(ref User u){
   u = null;
}

एक रेफरी संशोधक के साथ पारित तर्क को पारित होने से पहले प्रारंभ किया जाना चाहिए।

आउट संशोधक

यह रेफरी संशोधक के समान है, सिवाय

. के
  • फ़ंक्शन में जाने से पहले तर्क को प्रारंभ करने की आवश्यकता नहीं है

  • फंक्शन से बाहर आने से पहले तर्क को इनिशियलाइज़ (असाइन किया गया) होना चाहिए।

नीचे दिए गए उदाहरण में, हायर फ़ंक्शन आउट संशोधक के माध्यम से इसे पास किए गए एक नए उपयोगकर्ता ऑब्जेक्ट को प्रारंभ करता है। ध्यान दें कि हायर मेथड को कॉल करते समय वेरिएबल वेरिएबल जॉन को फ्लाई पर घोषित किया जाता है।

using System;
Hire(out User john);
Console.WriteLine(john.Salary); // prints 50000
static void Hire(out User u){
   u = new User{
      Name = "John",
      Salary = 50000
   };
}

रेफरी . की तरह संशोधक, बाहर . द्वारा चिह्नित एक चर संशोधक संदर्भ द्वारा पारित किया जाता है।

अक्सर एक बाहर वेरिएबल का उपयोग फ़ंक्शन से कई रिटर्न वैल्यू प्राप्त करने के लिए निम्नानुसार किया जाता है -

using System;
var john = new User{
   Name = "John",
   Salary = 50000
};
bool shouldPromote = Raise(john.Salary, out double hike);
Console.WriteLine(shouldPromote); // True
Console.WriteLine($"Hike Amount = {hike}"); // prints 5000
static bool Raise(int salary, out double hike){
   hike = salary * 0.1;
   return hike < 7000;
}

संशोधक में

यह रेफरी . के समान है और बाहर पैरामीटर, सिवाय इसके कि एक इन . को स्वीकार करने वाली विधि तर्क का मान तर्क को संशोधित नहीं कर सकता। यदि यह कोशिश करता है, तो C# संकलक एक संकलन-समय त्रुटि उत्पन्न करता है।

में पैरामीटर कंपाइलर को बड़े मान प्रकार की मेमोरी को पैरामीटर वेरिएबल में कॉपी करने से बचाता है, साथ ही ऑब्जेक्ट को आकस्मिक संशोधन से रोकता है। विधि में बड़े मान प्रकार को पास करते समय यह उन्हें बहुत उपयोगी बनाता है।

var point = new Coord();
Verify(point);
static void Verify(in Coord c){
   // error: Cannot assign to variable 'in Coord' because it is a readonly variable
   c = new Coord();
}
struct Coord{
   public int X;
   public int Y;
}

उदाहरण

using System;
class Program{
   static void Main(){
      int number = 8;
      Increase(number);
      Console.WriteLine(number); // prints 8
      var john = new User { Name = "John", Salary = 50000 };
      Promote(john);
      Console.WriteLine(john.Salary); // prints 60000
      Leave(john);
      Console.WriteLine(john.Salary); // prints 60000

      LeaveByRef(ref john);
      Console.WriteLine(john?.Salary); // prints nothing

      User dave;
      Hire(out dave);
      Console.WriteLine(dave.Salary); // prints 50000
   }
   static void Increase(int num){
      num = num + 1;
      Console.WriteLine(num); // prints 9
   }
   static void Promote(User u){
      u.Salary += 10000;
      Console.WriteLine(u.Salary); // prints 60000
   }
   static void Leave(User u){
      u = null;
   }
   static void LeaveByRef(ref User u){
      u = null;
   }
   static void Hire(out User u){
      u = new User{
         Name = "John",
         Salary = 50000
      };  
   }
}
class User{
   public string Name { get; set; }
   public int Salary { get; set; }
}

आउटपुट

9
8
60000
60000
60000
50000

  1. सी # में स्ट्रिंग और स्ट्रिंग के बीच क्या अंतर है?

    String System.String के लिए खड़ा है जबकि string System.String के लिए C# में एक उपनाम है - उदाहरण के लिए string str = "Welcome!"; यह आवश्यक नहीं है, लेकिन आम तौर पर जब आप कक्षाओं के साथ काम करते हैं तो स्ट्रिंग का उपयोग किया जाता है। string str = String.Format("Welcome! {0}!", u

  1. सी # में रेफरी और आउट पैरामीटर के बीच अंतर क्या हैं?

    रेफरी पैरामीटर एक संदर्भ पैरामीटर एक चर के स्मृति स्थान का संदर्भ है। जब आप संदर्भ द्वारा पैरामीटर पास करते हैं, तो मान पैरामीटर के विपरीत, इन पैरामीटर के लिए एक नया संग्रहण स्थान नहीं बनाया जाता है। आप रेफरी कीवर्ड का उपयोग करके संदर्भ पैरामीटर घोषित कर सकते हैं। निम्नलिखित एक उदाहरण है - उदाहरण

  1. पायथन में =+ और +=क्या करते हैं?

    +=ऑपरेटर ऑब्जेक्ट के लिए सिंटैक्टिक शुगर है।__iadd__() फ़ंक्शन। पायथन डॉक्स से: इन विधियों को संवर्धित अंकगणितीय असाइनमेंट को लागू करने के लिए कहा जाता है (+=, -=, *=, @=, /=, //=, %=, **=, =, &=, ^=, |=). इन विधियों को ऑपरेशन को जगह में करने का प्रयास करना चाहिए (स्वयं को संशोधित करना) और परिणाम व