प्रकार के बजाय एक प्रकार की बाधा के साथ एक सामान्य विधि का उपयोग क्यों करें?


14

एक अलग StackExchange प्रश्न में, मैंने किसी को इस प्रोटोटाइप का उपयोग करते हुए देखा:

void DoSomething<T>(T arg) where T: SomeSpecificReferenceType
{
    //Code....
}

ध्यान में रखते हुए केवल एक ही प्रकार की बाधा है ( SomeSpecificReferenceType), इसे लिखने का क्या अंतर और लाभ है, इसके बजाय बस:

void DoSomething(SomeSpecificReferenceType arg)
{
    //Code....
}

दोनों मामलों में, argसंकलन-समय प्रकार की जाँच के अधीन होगा। दोनों मामलों में, विधि का शरीर सुरक्षित रूप से उस ज्ञान पर भरोसा कर सकता argहै जो (या एक वंशज है) एक विशिष्ट प्रकार का है जो संकलन समय पर जाना जाता है।

क्या यह सामान्य वंशानुक्रम के बारे में सीखने से पहले जेनेरिक के बारे में अधिभावी डेवलपर का मामला है? या क्या कोई वैध कारण है कि एक विधि हस्ताक्षर इस तरह से लिखा जाएगा?


मैं मुश्किल से C # जानता हूं, इसलिए यह केवल एक अनुमान है, लेकिन क्या यह गतिशील प्रेषण के बजाय अधिक कुशल स्थिर प्रेषण सक्षम नहीं करता है?
एंटोन बर्कोवस्की

जवाबों:


13

क्या यह सामान्य वंशानुक्रम के बारे में सीखने से पहले जेनेरिक के बारे में अधिभावी डेवलपर का मामला है?

हाँ, यह शायद है।

या क्या कोई वैध कारण है कि एक विधि हस्ताक्षर इस तरह से लिखा जाएगा?

हो सकता है । आमतौर पर, यह अधिक समझ में आता है अगर इसमें कोई वापसी मूल्य शामिल था T, या एक और पैरामीटर जो उपयोग किया गया था T

लेकिन, यह संभव है कि कोड के इंटर्नल उपयोग करते हैं T(शायद एक धारावाहिक के लिए एक तर्क के रूप में?) और विशेष रूप से उपयोग करने की आवश्यकता है Tऔर न कि बाधा वर्ग। आप कभी-कभार देखते होंगे कि जब बाधा एक इंटरफेस है जिसे बाधा के साथ जोड़ा जाता है newऔर विधि की हिम्मत Tकिसी कारण से बनती है ।

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


1

मुझे लगता है कि मुझे खुद को याद है कि मैं इसका उत्तर लिख रहा हूं।

उस समय कारण इस तरह था:
(कोड भिन्न हो सकता है। बस एक संभावित कारण बताने के लिए कि जेनेरिक पद्धति में टाइप पैरामीटर पर एक बाधा क्यों है।)

class SomeSingleton
{
    static Dictionary<Type, List<object>> staticTypeSpecificList;
    public void AddObjectToList<T>(T t) where T : SomeCommonThing
    {
        Type tt = t.GetType();
        List<object> list;
        if (!staticTypeSpecificList.TryGet(tt, out list))
        {
            list = new List<object>();
            staticTypeSpecificList.Add(tt, list);
        }
        list.Add(t);
    }
}

मूल रूप से, कोड मैन्युअल रूप से कोडिंग प्रकार के हेरफेर में ही हो जाता है। यह भी कुछ प्रतिबिंब सामान के साथ मिलाया जा सकता है।

उदाहरण के लिए, का उपयोग करके Method<T>(T arg) where T : ..., एक के arg.GetType()साथ बदल सकते हैं typeof(T)। हालांकि, मुझे नहीं पता कि वह विकल्प अच्छा है या बुरा।

मुझे लगता है कि यह लेखक का एक उदाहरण है (संभवतः मैं, या कोई और) कोडिंग की संभावनाओं के माध्यम से ध्यान से नहीं सोच रहा है , एक ही समय में एक अलग प्रश्न / मुद्दे पर बहुत अधिक ध्यान केंद्रित कर रहा है।


"एक टाइपो (टी) के साथ arg.GetType () को प्रतिस्थापित कर सकता है"। यह उपयोगी है जब arg वैध रूप से अशक्त हो सकता है, जैसे कुछ क्रमांकन मामलों में।
वालपेन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.