C# Language
सी # 4.0 सुविधाएँ
खोज…
वैकल्पिक पैरामीटर और नामित तर्क
हम कॉल में तर्क को छोड़ सकते हैं यदि वह तर्क एक वैकल्पिक तर्क है प्रत्येक वैकल्पिक तर्क का अपना डिफ़ॉल्ट मूल्य है यह डिफ़ॉल्ट मान लेगा यदि हम मूल्य की आपूर्ति नहीं करते हैं तो वैकल्पिक तर्क का डिफ़ॉल्ट मान होना चाहिए
- लगातार अभिव्यक्ति।
- एक मान प्रकार होना चाहिए जैसे कि एनम या संरचना।
- प्रपत्र डिफ़ॉल्ट का मान होना चाहिए (ValueType)
इसे पैरामीटर सूची के अंत में सेट किया जाना चाहिए
डिफ़ॉल्ट मान के साथ विधि पैरामीटर:
public void ExampleMethod(int required, string optValue = "test", int optNum = 42)
{
//...
}
जैसा कि MSDN ने कहा है, एक नामित तर्क,
आपको पैरामीटर का नाम जोड़कर फ़ंक्शन के तर्क को पास करने में सक्षम करता है मापदंडों की स्थिति को याद रखने के लिए कोई ज़रूरत नहीं है कि हम हमेशा से अवगत नहीं हैं। बुलाया फ़ंक्शन के मापदंडों की सूची में मापदंडों के क्रम को देखने की आवश्यकता नहीं है। हम इसके नाम से प्रत्येक तर्क के लिए पैरामीटर निर्दिष्ट कर सकते हैं।
नामित तर्क:
// required = 3, optValue = "test", optNum = 4
ExampleMethod(3, optNum: 4);
// required = 2, optValue = "foo", optNum = 42
ExampleMethod(2, optValue: "foo");
// required = 6, optValue = "bar", optNum = 1
ExampleMethod(optNum: 1, optValue: "bar", required: 6);
एक नामित तर्क का उपयोग करने की सीमा
सभी निश्चित तर्कों को निर्दिष्ट किए जाने के बाद नामित तर्क विनिर्देश प्रकट होना चाहिए।
यदि आप एक निश्चित तर्क से पहले एक नामित तर्क का उपयोग करते हैं तो आपको निम्न संकलन समय त्रुटि मिलेगी।
सभी निश्चित तर्कों को निर्दिष्ट किए जाने के बाद नामित तर्क विनिर्देश प्रकट होना चाहिए
झगड़ा
जेनेरिक इंटरफेस और प्रतिनिधियों उनके प्रकार पैरामीटर के रूप में चिह्नित कर सकते हैं covariant या contravariant का उपयोग कर out
और in
क्रमश: कीवर्ड। इन घोषणाओं को तब निहितार्थ और स्पष्ट दोनों प्रकार के रूपांतरणों के लिए सम्मान दिया जाता है, और दोनों संकलन समय और समय चलाते हैं।
उदाहरण के लिए, मौजूदा इंटरफ़ेस IEnumerable<T>
को सहसंयोजक के रूप में पुनर्परिभाषित किया गया है:
interface IEnumerable<out T>
{
IEnumerator<T> GetEnumerator();
}
मौजूदा इंटरफ़ेस IComparer को संदर्भात्मक होने के कारण पुनर्परिभाषित किया गया है:
public interface IComparer<in T>
{
int Compare(T x, T y);
}
COM का उपयोग करते समय वैकल्पिक रेफरी कीवर्ड
COM इंटरफेस द्वारा आपूर्ति की जाने वाली विधियों में कॉल करते समय तरीकों के कॉल के लिए रेफरी कीवर्ड अब वैकल्पिक है। हस्ताक्षर के साथ एक COM विधि दी
void Increment(ref int x);
आह्वान अब के रूप में भी लिखा जा सकता है
Increment(0); // no need for "ref" or a place holder variable any more
गतिशील सदस्य लुकअप
एक नया छद्म प्रकार dynamic
C # प्रकार प्रणाली में पेश किया गया है। इसे System.Object
रूप में माना जाता है, लेकिन इसके अलावा, किसी भी सदस्य का उपयोग (विधि कॉल, फ़ील्ड, प्रॉपर्टी, या इंडेक्स एक्सेस, या एक प्रतिनिधि आह्वान) या इस प्रकार के मूल्य पर ऑपरेटर के आवेदन को किसी भी प्रकार की जाँच के बिना अनुमति दी जाती है, और इसका रिज़ॉल्यूशन रन-टाइम तक स्थगित कर दिया जाता है। इसे डक टाइपिंग या लेट बाइंडिंग के रूप में जाना जाता है। उदाहरण के लिए:
// Returns the value of Length property or field of any object
int GetLength(dynamic obj)
{
return obj.Length;
}
GetLength("Hello, world"); // a string has a Length property,
GetLength(new int[] { 1, 2, 3 }); // and so does an array,
GetLength(42); // but not an integer - an exception will be thrown
// in GetLength method at run-time
इस मामले में, गतिशील प्रकार का उपयोग अधिक क्रिया परावर्तन से बचने के लिए किया जाता है। यह अभी भी हुड के नीचे प्रतिबिंब का उपयोग करता है, लेकिन यह आमतौर पर कैशिंग के लिए तेजी से धन्यवाद है।
इस सुविधा को मुख्य रूप से गतिशील भाषाओं के साथ अंतर पर लक्षित किया जाता है।
// Initialize the engine and execute a file
var runtime = ScriptRuntime.CreateFromConfiguration();
dynamic globals = runtime.Globals;
runtime.ExecuteFile("Calc.rb");
// Use Calc type from Ruby
dynamic calc = globals.Calc.@new();
calc.valueA = 1337;
calc.valueB = 666;
dynamic answer = calc.Calculate();
डायनेमिक प्रकार में अधिकतर वैधानिक रूप से टाइप किए गए कोड में भी एप्लिकेशन होते हैं, उदाहरण के लिए यह विज़िटर पैटर्न को लागू किए बिना डबल डिस्पैच बनाता है।