2011-02-04 10 views
23

के लिए एक्सटेंशन विधि ऑब्जेक्ट क्लास पर एक्सटेंशन विधि का उपयोग करना अच्छा विचार है?सी # ऑब्जेक्ट

मैं सोच रहा था कि यदि आप प्रदर्शन पेनल्टी कर रहे थे तो इस विधि को पंजीकृत करके यह संदर्भ में लोड की गई प्रत्येक ऑब्जेक्ट पर लोड किया जाएगा।

+3

कोई प्रदर्शन की सजा है, लेकिन आप IntelliSense विकल्पों मेरे लिए refactor करने के लिए इस परियोजना में हर प्रतीक पर आ ... बहुत देर हो गई अपवित्र करते हैं, मैं यह फिर से ऐसा नहीं करेंगे मैं चुनाव करना था फिर। –

उत्तर

23

एक और जवाब के अलावा:

कोई प्रदर्शन दंड क्योंकि हो सकता है विस्तार विधियां कंपाइलर सुविधा है। कोड निम्नलिखित पर विचार करें:

public static class MyExtensions 
{ 
    public static void MyMethod(this object) { ... } 
} 

object obj = new object(); 
obj.MyMethod(); 

MyMethod करने के लिए कॉल करने के लिए वास्तव में संकलित किया जाएगा:

MyExtensions.MyMethod(obj); 
+0

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

3

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

इसके अलावा, यह विधि केवल तभी उपलब्ध होगी जहां आपका नामस्थान आयात किया गया हो।

मैं एक विधि है कि एक निर्दिष्ट प्रकार के कास्ट करने के लिए प्रयास करता है के लिए Object विस्तार किया है:

public static T TryCast<T>(this object input) 
{ 
    bool success; 
    return TryCast<T>(input, out success); 
} 

मैं भी यह अतिभारित (जैसे TryParse करता है) एक success bool में लेने के लिए:

public static T TryCast<T>(this object input, out bool success) 
{ 
    success = true; 
    if(input is T) 
     return (T)input; 
    success = false; 
    return default(T); 
} 

मैंने तब से इसे input (ToString का उपयोग करके और कनवर्टर का उपयोग करके) का विश्लेषण करने के लिए विस्तारित किया है, लेकिन यह अधिक जटिल हो जाता है।

+0

मुझे यह पसंद है, क्या आप वहां एक कोशिश/पकड़ ब्लॉक डालते हैं? –

+0

नहीं; मैं इसके साथ अद्यतन करूंगा। –

11

कोई प्रदर्शन दंड नहीं होगा क्योंकि यह सिस्टम में हर प्रकार से जुड़ा नहीं है, यह सिस्टम में किसी भी प्रकार पर कॉल करने के लिए उपलब्ध है। यह सब कुछ होगा कि विधि पर प्रत्येक इंटेलिजेंस में एकल ऑब्जेक्ट पर दिखाई देगी।

सवाल यह है: क्या आप वास्तव में को ऑब्जेक्ट पर होने की आवश्यकता है, या यह अधिक विशिष्ट हो सकता है। यदि इसे ऑब्जेक्ट पर होना आवश्यक है, तो इसे ऑब्जेक्ट के लिए बनाएं।

+7

यह ध्यान रखना अच्छा है कि यह केवल "इंटेलिजेंस में प्रत्येक ऑब्जेक्ट" पर दिखाएगा यदि आपने नेमस्पेस में एक उपयोग कथन शामिल किया है जिसमें आपकी एक्सटेंशन विधि को घोषित किया गया है। –

2

क्या ऑब्जेक्ट क्लास पर एक्सटेंशन विधि का उपयोग करना अच्छा विचार है?

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

उदाहरण के लिए विचार करना निम्न एक्सटेंशन विधि है जो किसी दिए गए वस्तु के सभी गुण सूचीबद्ध करता है और एक शब्दकोश में बदल देता है:

public static IDictionary<string, object> ObjectToDictionary(object instance) 
{ 
    var dictionary = new Dictionary<string, object>(StringComparer.OrdinalIgnoreCase); 
    if (instance != null) 
    { 
     foreach (var descriptor in TypeDescriptor.GetProperties(instance)) 
     { 
      object value = descriptor.GetValue(instance); 
      dictionary.Add(descriptor.Name, value); 
     } 
    } 
    return dictionary; 
} 
0

निम्न उदाहरण उपयोग में विस्तार विधि को दर्शाता है।

namespace NamespaceName 
{ 
public static class CommonUtil 
{ 
    public static string ListToString(this IList list) 
    { 
     StringBuilder result = new StringBuilder(""); 

     if (list.Count > 0) 
     { 
      result.Append(list[0].ToString()); 
      for (int i = 1; i < list.Count; i++) 
       result.AppendFormat(", {0}", list[i].ToString()); 
     } 
     return result.ToString(); 
    } 
    } 
} 

निम्नलिखित उदाहरण दर्शाता है कि इस विधि का उपयोग कैसे किया जा सकता है।

var _list = DataContextORM.ExecuteQuery<string>("Select name from products").ToList(); 
string result = _list.ListToString(); 
संबंधित मुद्दे