2009-11-02 4 views
5

में स्टेटिक कार्य का उपयोग करने के मैं, सोच कर दिया गया है उन्हें प्रयोग में नहीं ASP.NETजब यह सबसे अच्छा है ASP.NET

में

फायदे और नुकसान क्या हैं स्थिर कार्य करता है और जब उपयोग करने के लिए करते हैं, विभिन्न पहलुओं में प्रदर्शन की तरह, अच्छे प्रथाओं आदि के बाद (और कई और, जो आप कभी भी महसूस करते हैं प्रासंगिक है)।

आपके उत्तरों के लिए तत्पर हैं।

धन्यवाद,
महेश वेलागा।

+4

देखें http://stackoverflow.com/questions/169378/c-method-can-be-made-static-but-should-it – cdonner

+0

कुछ simillar सवाल काफी: http : //stackoverflow.com/search? q = static + विधियां –

+0

@cdonner और @preet .. लिंक के लिए धन्यवाद .. लेकिन मैं समुदाय से स्थिर तरीकों पर एक व्यापक इनपुट की तलाश में था, क्योंकि मैं बहुत स्पष्ट नहीं था टी उन्हें .. धन्यवाद फिर से .. :) –

उत्तर

4

विपक्ष:

  • सूत्रण मुद्दों (स्थिर कार्यों एक उदाहरण की आवश्यकता नहीं है पर कहा जा, तो यह उन्हें कोड के विभिन्न भागों से आह्वान करने के लिए आसान है और अगर वे एक साझा करने के लिए पढ़ने/लिखने यह राज्य एक बहु थ्रेडेड वातावरण जैसे एएसपी.नेट) में दूषित हो सकता है
  • यूनिट परीक्षण के लिए मुश्किल (जैसे स्थिर कार्यों को ऑब्जेक्ट इंस्टेंस की आवश्यकता नहीं होती है, कन्स्ट्रक्टर इंजेक्शन असंभव है जिसका अर्थ निर्भरता को इंजेक्ट करने का एकमात्र तरीका है उन्हें फ़ंक्शन में तर्क के रूप में पास करके)

सकारात्मक:

  • प्रदर्शन (यह संदिग्ध है - ज्यादातर मामलों में निष्पादन लाभ कोड के अन्य भागों की तुलना में पूरी तरह से नगण्य हो जाएगा)
+0

क्या आप कृपया उस पर विस्तार कर सकते हैं, या क्या आप उस दिशा में कुछ पॉइंटर्स प्रदान कर सकते हैं .. धन्यवाद –

+0

कोई अन्य लाभ अर्थशास्त्र नहीं होगा: कुछ व्यवहार कार्य करने के लिए एक संलग्न उदाहरण पर निर्भर नहीं हैं, इसलिए उन्हें चिह्नित करने के लिए यह "सही" है। – ehdv

+1

@ehdv जो प्रदर्शन का विस्तार है - केवल अनावश्यक उदाहरणों को खत्म कर रहा है। –

1

एक स्थिर विधि के लिए एक ही मुख्य नुकसान यह है कि है लगभग पूरी तरह से गैर इकाई परीक्षण योग्य। विधि के उपयोगकर्ताओं को ठोस विधि से बांधना पड़ता है और एक अमूर्तता से बंधे नहीं जा सकते हैं, इस प्रकार असंभव नहीं होने पर मुश्किल लगाना या मजाक करना मुश्किल हो सकता है।

हालांकि, कोड के आधार पर यह कोई समस्या हो सकती है या नहीं भी हो सकती है।

दूसरी चीज जिसके लिए आप देखना चाहते हैं यह है कि स्थिर डेटा सर्वर के सभी अनुरोधों में सार्वभौमिक है।

+1

यह एएसपी.नेट डेवलपर्स की शुरुआत के लिए भी बेहद उलझन में है। –

2

निश्चित रूप से ऐसी स्थितियां हैं जहां स्थैतिक उचित समाधान है, जैसा कि किसी भी आवेदन के साथ है। किसी भी समय आपके पास कुछ ऑब्जेक्ट है जो एप्लिकेशन स्कोप पर रहना चाहिए, न कि अनुरोध के दायरे पर, यह स्थैतिक होना चाहिए और आपको इसे एक्सेस करने और कुशलतापूर्वक उपयोग करने के लिए स्थिर विधियों का उपयोग करना चाहिए।

उदाहरण के तौर पर, यहां एक कोड का एक स्निपेट है जिसे मैंने हाल ही में एएसपी.NET एप्लिकेशन के लिए लिखा था, जो अनिवार्य रूप से एक धारावाहिक कैश है। Serializers बनाने के लिए महंगे हैं और हम जब तक हमारे आवेदन जीवन के रूप में के लिए प्रकार के अनुसार एक ही एक का पुन: उपयोग कर सकते हैं, इसलिए उनके लिए प्रत्येक अनुरोध सूत्र में समय बर्बाद करने के लिए कोई ज़रूरत नहीं है:

(नोट: इस नीचे छीन कर दिया गया है स्थिर पहलुओं को प्रदर्शित करने के)

public class XmlSerializerUtility 
{ 
    private static Dictionary<Type, XmlSerializer> serializers = new Dictionary<Type, XmlSerializer>(); 
    private static object sync = new object(); 

    public static T Deserialize<T>(string input) 
    { 
     XmlSerializer xs = GetSerializer(typeof(T)); 
     using (StringReader sr = new StringReader(input)) 
     { 
      return (T)xs.Deserialize(sr); 
     } 
    } 

    public static XmlDocument Serialize(object input) 
    { 
     XmlDocument doc = new XmlDocument(); 
     XmlSerializer xs = GetSerializer(input.GetType()); 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      xs.Serialize(stream, input); 
      stream.Position = 0; 
      doc.Load(stream); 
     } 
     return doc; 
    } 

    private static XmlSerializer GetSerializer(Type type) 
    { 
     lock (sync) 
     { 
      XmlSerializer xs = null; 
      if (!serializers.ContainsKey(type)) 
      { 
       xs = new XmlSerializer(type); 
       serializers.Add(type, xs); 
      } 
      else 
      { 
       xs = serializers[type]; 
      } 
      return xs; 
     } 
    } 
} 
+1

@Rex M, आपका 'शब्दकोश <टाइप, एक्सएमएलएसरियलाइज़र>' व्यर्थ है, एक्सएमएलएसरियलाइज़र पहले से ही उन्नत कैशिंग तकनीकों का उपयोग करता है और यह उसी प्रकार के लिए एक ही अस्थायी असेंबली नहीं बनायेगा। एक सरल 'नया XmlSerializer (प्रकार)' नौकरी ठीक करेगा। मैंने एक बार यह पता लगाने के लिए एक ही काम किया है कि 'लॉक' कथन धारावाहिक को नया करने के रूप में धीमा था :-) –

+0

@ डारिन मुझे लगता है कि आप गलत हो सकते हैं। XmlSerializerFactory वास्तव में कैशिंग का उपयोग करता है, लेकिन जेनेरिक प्रकारों का बहुत अच्छा समर्थन नहीं करता है। XmlSerializer (कोई कारखाना) कैश नहीं है। प्रलेखन के अनुसार –

+0

@Rex M, http://msdn.microsoft.com/en-us/library/system.xml.serialization.xmlserializer.aspx) यदि आप किसी भी ctors का उपयोग करते हैं: 'XmlSerializer.XmlSerializer (प्रकार) 'या' XmlSerializer.XmlSerializer (टाइप, स्ट्रिंग) 'जो आप करते हैं: एक्सएमएल सीरियलाइजेशन इंफ्रास्ट्रक्चर गतिशील रूप से निर्दिष्ट प्रकारों को क्रमबद्ध और deserialize करने के लिए असेंबली उत्पन्न करता है। आधारभूत संरचना उन विधानसभाओं को पाती है और उनका पुन: उपयोग करती है। –