2013-07-10 8 views
10

AFAIK void प्रोग्रामिंग भाषा के मामले में कुछ भी नहीं है। तो क्यों .NET ढांचे में इसे struct के रूप में घोषित किया गया है?वापसी प्रकार शून्य को .NET में संरचना के रूप में क्यों घोषित किया गया है?

using System.Runtime.InteropServices; 

namespace System 
{ 
    /// <summary> 
    /// Specifies a return value type for a method that does not return a value. 
    /// </summary> 
    /// <filterpriority>2</filterpriority> 
    [ComVisible(true)] 
    [Serializable] 
    [StructLayout(LayoutKind.Sequential, Size = 1)] 
    public struct Void 
    { 
    } 
} 

उत्तर

15

System.Void प्रभावी रूप से एक मार्कर प्रकार है - MethodInfo.ReturnType तरह सदस्यों void का प्रतिनिधित्व करने के कुछ तरीका है करने के लिए है, और System.Void तरह से नेट टीम ऐसा करने के लिए चुना है है।

आपको इसे सामान्य प्रकार की तरह उपयोग नहीं करना चाहिए। यह एक कामकाज है, प्रभावी रूप से - F# Unit type की तरह थोड़ा, लेकिन टाइप सिस्टम में पूरी तरह से एकीकृत नहीं है।

+0

इस तरह के एक अच्छे जवाब के लिए ty सर! –

+0

अगर शून्य को वर्कअराउंड के रूप में उपयोग करने के बजाय .net में अच्छी तरह से एकीकृत किया गया था, तो क्या इससे बेहतर प्रदर्शन नहीं हुआ होगा? –

+1

@App डेवलपर, मुझे नहीं लगता कि यह प्रदर्शन को प्रभावित करेगा, यह वास्तव में केवल संकलित करता है कि कैसे संकलन संकलित होते हैं, और यदि वे कोई मान वापस करते हैं या नहीं। सी # शून्य कार्य, या वीबी सबस सिर्फ मान वापस नहीं करते हैं, इसलिए इसके लिए स्टैक मानों को धक्का/पॉप करने के लिए आईएल कोड अभी छोड़ा गया है। – Kratz

2

एक विधि वर्णनकर्ता में विधि के रिटर्न प्रकार के लिए एक फ़ील्ड होता है। हालांकि void कार्यों के लिए उस क्षेत्र को null होना संभव होगा, जिसके लिए उस कोड की आवश्यकता होगी जो उदा।

string theReturnType = theMethod.ReturnType ? theMethod.ReturnType.ToString() : "null"; 

बजाय बस कह रही:: विधि की वापसी प्रकार की रिपोर्ट कुछ की तरह कहते हैं कि

string theReturnType = theMethod.ReturnType.ToString(); 

पर्याप्त मामलों में जहां कोड विधि की वापसी प्रकार के साथ कुछ करने के लिए विशेष-केस अशक्त करने के लिए है कि कर रहे हैं उनमें से सभी में एक डमी प्रकार "नल" होने से कहीं अधिक परेशान होगा जिसे वापस किया जा सकता है।

संयोग से, हालांकि मुझे पता है कि void एकमात्र प्रकार है जो एक विधि वापसी मूल्य के लिए प्रयोग योग्य है लेकिन कोई अन्य उद्देश्य नहीं है, ऐसे अन्य मामले हैं जहां सार्वजनिक प्रकार के लिए उपयोग किया जा सकता है मान, लेकिन बाहरी भंडारण-स्थान घोषणाओं में उपयोग नहीं किया जाता है, जैसे कि एक धाराप्रवाह इंटरफ़ेस लिखते समय (यदि बाहरी कोड को biz.boz(3) के सदस्यों तक पहुंचने की अनुमति दी जा सकती है, लेकिन मूल्य को स्वयं स्टोर नहीं कर सका, तो biz.boz(3).foo(9).bar(2).build() जैसे निर्माण में, foo विधि यह जान सकता है कि ब्रह्मांड में boz(3) द्वारा लौटाई गई ऑब्जेक्ट में कहीं भी एकमात्र संदर्भ रखा गया था, और इस प्रकार इसे या तो अनुकूलित करने या इसकी सुविधा पर एक नया उदाहरण वापस करने के लिए स्वतंत्र होगा)।

संबंधित मुद्दे

 संबंधित मुद्दे