खोज…
एक विधि की घोषणा
हर विधि में एक अद्वितीय हस्ताक्षर होता है जिसमें एक एक्सेसर ( public
, private
, ...), वैकल्पिक संशोधक ( abstract
), एक नाम और यदि आवश्यक विधि पैरामीटर होते हैं। ध्यान दें, कि वापसी प्रकार हस्ताक्षर का हिस्सा नहीं है। एक विधि प्रोटोटाइप निम्नलिखित की तरह दिखता है:
AccessModifier OptionalModifier ReturnType MethodName(InputParameters)
{
//Method body
}
AccessModifier
public
, protected
, pirvate
या डिफ़ॉल्ट रूप से internal
।
OptionalModifier
static
abstract
virtual
override
new
या sealed
।
ReturnType
हो सकता है void
कोई वापसी के लिए या बुनियादी लोगों से किसी भी प्रकार, के रूप में हो सकता है int
जटिल वर्गों के लिए।
एक विधि में कुछ या कोई इनपुट पैरामीटर हो सकते हैं। एक विधि के लिए पैरामीटर सेट करने के लिए, आपको प्रत्येक को सामान्य चर घोषणाओं (जैसे int a
) की तरह घोषित करना चाहिए, और एक से अधिक मापदंडों के लिए आपको उनके बीच कॉमा (जैसे int a, int b
) का उपयोग करना चाहिए।
पैरामीटर में डिफ़ॉल्ट मान हो सकते हैं। इसके लिए आपको पैरामीटर के लिए मान सेट करना चाहिए (जैसे int a = 0
)। यदि किसी पैरामीटर का डिफ़ॉल्ट मान है, तो इनपुट मान सेट करना वैकल्पिक है।
निम्न विधि उदाहरण दो पूर्णांक का योग लौटाता है:
private int Sum(int a, int b)
{
return a + b;
}
एक विधि का आह्वान
एक स्थिर विधि कॉलिंग:
// Single argument
System.Console.WriteLine("Hello World");
// Multiple arguments
string name = "User";
System.Console.WriteLine("Hello, {0}!", name);
एक स्थैतिक विधि का आह्वान करना और उसका रिटर्न मान जमा करना:
string input = System.Console.ReadLine();
एक आवृत्ति विधि को कॉल करना:
int x = 42;
// The instance method called here is Int32.ToString()
string xAsString = x.ToString();
जेनेरिक विधि कहलाना
// Assuming a method 'T[] CreateArray<T>(int size)'
DateTime[] dates = CreateArray<DateTime>(8);
पैरामीटर और तर्क
एक विधि किसी भी पैरामीटर को घोषित कर सकती है (इस उदाहरण में, i
, s
और o
पैरामीटर हैं):
static void DoSomething(int i, string s, object o) {
Console.WriteLine(String.Format("i={0}, s={1}, o={2}", i, s, o));
}
मानों को किसी विधि में मानने के लिए उपयोग किया जा सकता है, ताकि विधि उनके साथ काम कर सके। यह हर तरह का काम हो सकता है जैसे मानों को प्रिंट करना, या किसी पैरामीटर द्वारा संदर्भित ऑब्जेक्ट में संशोधन करना, या मूल्यों को संग्रहीत करना।
जब आप विधि को कॉल करते हैं, तो आपको प्रत्येक पैरामीटर के लिए एक वास्तविक मान पास करना होगा। इस बिंदु पर, वे मूल्य जो आप वास्तव में मेथड कॉल पर जाते हैं, वे तर्क कहलाते हैं:
DoSomething(x, "hello", new object());
वापसी के प्रकार
एक विधि कुछ भी नहीं ( void
), या एक निर्दिष्ट प्रकार के मूल्य वापस कर सकते हैं:
// If you don't want to return a value, use void as return type.
static void ReturnsNothing() {
Console.WriteLine("Returns nothing");
}
// If you want to return a value, you need to specify its type.
static string ReturnsHelloWorld() {
return "Hello World";
}
यदि आपकी विधि रिटर्न मान निर्दिष्ट करती है, तो विधि को मान वापस करना होगा । आप return
स्टेटमेंट का उपयोग करके ऐसा करते return
। एक बार return
स्टेटमेंट हो return
बाद, यह निर्दिष्ट मान देता है और किसी भी कोड के बाद इसे अब नहीं चलाया जाएगा (अपवाद finally
ब्लॉक हैं, जिसे अभी भी विधि रिटर्न से पहले निष्पादित किया जाएगा)।
यदि आपकी विधि कुछ भी नहीं ( void
) लौटाती है, तो आप अभी भी मूल्य के बिना return
स्टेटमेंट का उपयोग कर सकते हैं यदि आप तुरंत विधि से वापस लौटना चाहते हैं। इस तरह की विधि के अंत में, एक return
विवरण हालांकि अनावश्यक होगा।
मान्य return
स्टेटमेंट के उदाहरण:
return;
return 0;
return x * 2;
return Console.ReadLine();
किसी मान को वापस किए बिना अपवाद को फेंकने से विधि निष्पादन समाप्त हो सकता है। इसके अलावा, इट्रेटर ब्लॉक भी हैं, जहां उपज कीवर्ड का उपयोग करके रिटर्न मान उत्पन्न होते हैं, लेकिन वे विशेष मामले हैं जिन्हें इस बिंदु पर समझाया नहीं जाएगा।
डिफ़ॉल्ट पैरामीटर
यदि आप पैरामीटर छोड़ने का विकल्प प्रदान करना चाहते हैं, तो आप डिफ़ॉल्ट मापदंडों का उपयोग कर सकते हैं:
static void SaySomething(string what = "ehh") {
Console.WriteLine(what);
}
static void Main() {
// prints "hello"
SaySomething("hello");
// prints "ehh"
SaySomething(); // The compiler compiles this as if we had typed SaySomething("ehh")
}
जब आप ऐसी विधि कहते हैं और उस पैरामीटर को छोड़ देते हैं जिसके लिए एक डिफ़ॉल्ट मान प्रदान किया जाता है, तो कंपाइलर आपके लिए उस डिफ़ॉल्ट मान को सम्मिलित करता है।
ध्यान रखें कि डिफ़ॉल्ट मानों के साथ पैरामीटर को डिफ़ॉल्ट मानों के बिना मापदंडों के बाद लिखा जाना चाहिए।
static void SaySomething(string say, string what = "ehh") {
//Correct
Console.WriteLine(say + what);
}
static void SaySomethingElse(string what = "ehh", string say) {
//Incorrect
Console.WriteLine(say + what);
}
चेतावनी : क्योंकि यह इस तरह से काम करता है, कुछ मामलों में डिफ़ॉल्ट मान समस्याग्रस्त हो सकते हैं। यदि आप किसी विधि पैरामीटर के डिफ़ॉल्ट मान को बदलते हैं और उस पद्धति के सभी कॉलर्स को पुन: प्राप्त नहीं करते हैं, तो वे कॉलर्स अभी भी डिफ़ॉल्ट मान का उपयोग करेंगे जो कि संकलित होने पर मौजूद थे, संभवतः असंगति पैदा कर रहे थे।
विधि अधिभार
परिभाषा: जब अलग-अलग मापदंडों के साथ एक ही नाम के कई तरीकों को घोषित किया जाता है, तो इसे विधि अधिभार कहा जाता है। ओवरलोडिंग विधि आमतौर पर उन कार्यों का प्रतिनिधित्व करती है जो उनके उद्देश्य में समान हैं लेकिन उनके मापदंडों के रूप में विभिन्न डेटा प्रकारों को स्वीकार करने के लिए लिखे गए हैं।
प्रभावित करने वाले तत्व
- तर्क की संख्या
- तर्कों का प्रकार
- वापसी प्रकार **
Area
नामक एक विधि पर विचार करें जो गणना कार्य करेगा, जो विभिन्न तर्कों को स्वीकार करेगा और परिणाम लौटाएगा।
उदाहरण
public string Area(int value1)
{
return String.Format("Area of Square is {0}", value1 * value1);
}
यह विधि एक तर्क को स्वीकार करेगी और एक स्ट्रिंग लौटाएगी, अगर हम एक पूर्णांक के साथ विधि को कहते हैं ( 5
कहते हैं) आउटपुट "Area of Square is 25"
।
public double Area(double value1, double value2)
{
return value1 * value2;
}
इसी तरह अगर हम इस पद्धति से दो दोहरे मान पास करते हैं तो आउटपुट दो मानों का उत्पाद होगा और टाइप डबल का होगा। यह आयतों के क्षेत्रफल का पता लगाने के साथ-साथ गुणा का भी उपयोग किया जा सकता है
public double Area(double value1)
{
return 3.14 * Math.Pow(value1,2);
}
इसका उपयोग विशेष रूप से सर्कल के क्षेत्र को खोजने के लिए किया जा सकता है, जो एक डबल मान ( radius
) को स्वीकार करेगा और इसके क्षेत्र के रूप में एक और डबल मान लौटाएगा।
इन तरीकों में से प्रत्येक को संघर्ष के बिना सामान्य रूप से कहा जा सकता है - संकलक प्रत्येक विधि कॉल के मापदंडों की जांच करेगा यह निर्धारित करने के लिए कि Area
किस संस्करण का उपयोग करने की आवश्यकता है।
string squareArea = Area(2);
double rectangleArea = Area(32.0, 17.5);
double circleArea = Area(5.0); // all of these are valid and will compile.
** ध्यान दें कि वापसी प्रकार अकेले दो तरीकों के बीच अंतर नहीं कर सकते हैं। उदाहरण के लिए, यदि हमारे पास क्षेत्र के लिए दो परिभाषाएँ थीं जिनके समान पैरामीटर थे, जैसे:
public string Area(double width, double height) { ... }
public double Area(double width, double height) { ... }
// This will NOT compile.
अगर हमें अपनी कक्षा को समान विधियों के नामों का उपयोग करने की आवश्यकता है जो विभिन्न मूल्यों को लौटाते हैं, तो हम एक इंटरफ़ेस लागू करके अस्पष्टता के मुद्दों को हटा सकते हैं और इसके उपयोग को स्पष्ट रूप से परिभाषित कर सकते हैं।
public interface IAreaCalculatorString {
public string Area(double width, double height);
}
public class AreaCalculator : IAreaCalculatorString {
public string IAreaCalculatorString.Area(double width, double height) { ... }
// Note that the method call now explicitly says it will be used when called through
// the IAreaCalculatorString interface, allowing us to resolve the ambiguity.
public double Area(double width, double height) { ... }
अनाम विधि
बेनामी तरीके एक कोड ब्लॉक को एक प्रतिनिधि पैरामीटर के रूप में पारित करने के लिए एक तकनीक प्रदान करते हैं। वे एक शरीर के साथ तरीके हैं, लेकिन कोई नाम नहीं।
delegate int IntOp(int lhs, int rhs);
class Program
{
static void Main(string[] args)
{
// C# 2.0 definition
IntOp add = delegate(int lhs, int rhs)
{
return lhs + rhs;
};
// C# 3.0 definition
IntOp mul = (lhs, rhs) =>
{
return lhs * rhs;
};
// C# 3.0 definition - shorthand
IntOp sub = (lhs, rhs) => lhs - rhs;
// Calling each method
Console.WriteLine("2 + 3 = " + add(2, 3));
Console.WriteLine("2 * 3 = " + mul(2, 3));
Console.WriteLine("2 - 3 = " + sub(2, 3));
}
}
पहुंच अधिकार
// static: is callable on a class even when no instance of the class has been created
public static void MyMethod()
// virtual: can be called or overridden in an inherited class
public virtual void MyMethod()
// internal: access is limited within the current assembly
internal void MyMethod()
//private: access is limited only within the same class
private void MyMethod()
//public: access right from every class / assembly
public void MyMethod()
//protected: access is limited to the containing class or types derived from it
protected void MyMethod()
//protected internal: access is limited to the current assembly or types derived from the containing class.
protected internal void MyMethod()