2009-09-12 17 views
14

कितने तरीके हो सकते हैं क्या गुणों की संख्या पर कोई सीमा है, सी # कक्षा के तरीके हो सकते हैं?सी # कक्षा में

मैं मानक ईसीएमए -334 पर त्वरित स्कीम करता हूं और इसके बारे में कोई जानकारी नहीं मिली।

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

तो इस सवाल के लिए, यदि कोई सीमा है और गुणों, विधियों की संख्या के लिए सीमा क्या है, तो मुझे केवल रूचि है।

+2

-1 के रूप में कई तरीकों के साथ एक वर्ग पैदा करने की दर्द माध्यम से चला गया - यह कोई बात नहीं। एंड्रे हॉफमैन का उत्कृष्ट जवाब देखें। – TrueWill

+17

@ ट्राउविल: असहमत 100%। इससे कोई फर्क नहीं पड़ता, लेकिन यह डेर्नपॉउट के लिए महत्वपूर्ण है। मैं समझता हूं कि अच्छा अभ्यास बेहद महत्वपूर्ण है, लेकिन यह सवाल नहीं है। हमें पूछताछ के परिदृश्य को नहीं मानना ​​चाहिए, न ही हमें औचित्य की मांग करनी चाहिए। हमें प्रश्न का उत्तर देना चाहिए, और यदि आवश्यक हो, तो अच्छे अभ्यास सुझावों के साथ पूरक। – andy

उत्तर

1

आप से अधिक कभी भी एक कक्षा में रखना चाहते हैं।

17

मुझे नहीं पता कि सी # कक्षा में कितने तरीके हो सकते हैं, लेकिन मुझे पता है कि जब आप इसके बारे में सोच रहे हैं तो आप निश्चित रूप से कुछ गलत कर रहे हैं।

यदि कोई सीमा है (जो मुझे संदेह है) तो यह इतना अधिक है कि आप इससे अधिक नहीं होंगे। सिवाय इसके कि आपके पास वास्तव में खराब वर्ग डिज़ाइन है।

एंटी-पैटर्न "God object" देखें।

अद्यतन:

हालांकि मैं अभी भी वास्तव में नहीं जानते कि तुम क्या हासिल करना चाहते, मैं अभी भी विश्वास है कि आप निश्चित रूप से निम्नलिखित कारणों के लिए केवल कुछ ही तरीकों के साथ वर्गों का एक बहुत बनाने चाहिए:

  • प्रदर्शन: यदि आप एक वर्ग में सभी गुण लगा रहे हैं, तो हर संपत्ति स्मृति के लिए, भले ही आप केवल अपनी कक्षा में गुण के 5% की जरूरत आवंटित किया जाना है जब आप एक उदाहरण बनाने की है,

  • प्रतिरूपकता: यदि आप वर्गों का एक बहुत बनाने के आप उन सभी को एक अंतरफलक/सार वर्ग को लागू और इस तरह एक समान संरचना, आपके आवेदन अधिक मॉड्यूलर बनाने में मदद मिलेगी जो परिभाषित कर सकते हैं

  • संरचना: यह जो तरीकों जो गुणों का उपयोग जब केवल वे एक ही कक्षा में रहते हैं को देखने के लिए बहुत सीधा है - अन्यथा चीजें वास्तव में बहुत गंदा हो सकती है

  • समय संकलन: जब एक समारोह के कार्यान्वयन को बदलने मोर्चे, दूसरों के रूप में वे अन्य वर्गों

+0

डाउनवॉटिंग के दौरान कृपया एक टिप्पणी छोड़ दें। –

+8

यह एक उत्तर नहीं है। यह कैसे मदद कर सकता है (उदाहरण के लिए) DHornpout सी # कंपाइलर या कुछ लिखना चाहता है? –

+9

यह तय करने के लिए कि यह सहायक है या नहीं, हमें यह जानना होगा कि वह वास्तव में क्या कर रहा है। चूंकि हम नहीं करते हैं, इसलिए मैंने नियमित मामला माना, जिसमें एक कंपाइलर बनाने में शामिल नहीं है। –

1

हाँ में हैं, फिर से संकलित की जरूरत नहीं है ...

इसका सामान्य ज्ञान कहा जाता है। कक्षा को अधिभारित न करने का प्रयास करें, यह संभवतः एक जिम्मेदारी सिद्धांत का उल्लंघन करेगा, और कोई भी इसे समझने में सक्षम नहीं होगा।

सब के बाद, एक वर्ग वहाँ (हाँ, मुझे पता है एक खतरनाक बयान thats)

1

"केवल डेवलपर, नहीं कर सकते जो अपने अल्पकालिक स्मृति में एक बार में अधिक तो 7 जानकारियां फिट सहायता करने के लिए" है मैं डॉन ' ऐसा मत सोचो।हालांकि, अच्छे सॉफ़्टवेयर विकास प्रथाओं और दिशानिर्देशों का पालन करने और विचार करने पर दिशानिर्देशों को उन गुणों और विधियों की संख्या को स्वाभाविक रूप से सीमित करना चाहिए जिन्हें कक्षा में समझदारी और पूर्ण आवश्यकता होती है। इस तरह के प्रथाओं में सोलिड, किआईएसएस (इसे सरल रखें), डीआरवाई (खुद को दोहराएं), रचना, रिफैक्टरिंग, विरासत इत्यादि

27

16.7 मिलियन प्रति असेंबली प्रति विधि (वर्ग नहीं)।

+4

ऐसा हो सकता है, लेकिन क्या आप इस जानकारी के स्रोत का उल्लेख कर सकते हैं? –

+10

विधि परिभाषा तालिका केवल इंडेक्स के 24 बिट्स के लिए है। सरल गणित Spec पढ़ें :) – leppie

+0

वास्तव में MethodDef तालिका में कोई विशिष्ट सीमा नहीं है। हालांकि, मेटाडेटा टोकन के इंडेक्स हिस्से में केवल 24 बिट उपलब्ध हैं, इसलिए जब आप शायद 2^24 विधियों के साथ .NET असेंबली बना सकते हैं, तो आप केवल पहले 2^24 प्लस को संदर्भित कर सकते हैं, मुझे संदेह है कि सीएलआर होगा इसे लोड करें। –

4

Type.GetMethods विधि एक सरणी कि इतने एक पूर्णांक द्वारा अनुक्रमित किया जाना चाहिए देता है, मैं कहूंगा कि आप प्रति कक्षा एक से अधिक int.MaxValue पद्धतियां नहीं हो सकतीं।

0

मैं एक स्वचालित कोड पीढ़ी उपकरण है और मैं वर्तमान में ~ 5K (जो काम किया) और 10K के बीच सीमा, जो विफल रहा है

System.TypeLoadException: Type '<the type name>' from assembly '<the assembly name>, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' contains more methods than the current implementation allows. 

तो इस के विपरीत दावा है कि यह "असीमित" है मारा।

+0

क्या आप सही सीमा जानते हैं? एक वास्तविक वास्तविक उत्तर होने के लिए –

14

वर्तमान सीएलआर कार्यान्वयन में सही उत्तर ushort.MaxValue - 15 है। यह इस प्रकार का परीक्षण किया जा सकता है:

AppDomain appDomain = AppDomain.CurrentDomain; 

AssemblyName aname = new AssemblyName ("MyDynamicAssembly"); 

AssemblyBuilder assemBuilder = 
    appDomain.DefineDynamicAssembly (aname, AssemblyBuilderAccess.Run); 

ModuleBuilder modBuilder = assemBuilder.DefineDynamicModule ("DynModule"); 

TypeBuilder tb = modBuilder.DefineType ("Widget", TypeAttributes.Public); 

for (int i = 0; i < ushort.MaxValue - 15; i++) 
{ 
    MethodBuilder methBuilder = tb.DefineMethod ("SayHello" + i, MethodAttributes.Public, null, null); 
    ILGenerator gen = methBuilder.GetILGenerator(); 
    gen.EmitWriteLine ("Hello world"); 
    gen.Emit (OpCodes.Ret); 
} 
Type t = tb.CreateType(); 
object o = Activator.CreateInstance (t); 

प्रश्न यदि आप एक डेटाबेस वापस करने के लिए एक टाइप किया DataContext बनाने के लिए (LINQPad करता है) Reflection.Emit का उपयोग कर रहे प्रासंगिक है। पर्याप्त संग्रहित प्रक्रियाओं के साथ, आप इस सीमा को हिट कर सकते हैं! इस पर

+2

+1। यदि संभव हो तो मैं प्लस दस का उत्तर दूंगा, विशेष रूप से उन सभी अन्य खाली उत्तरों पर विचार करना जिन्हें बहुत अधिक अपवर्तित हुए थे। केवल अगर आप किसी चीज की वास्तविक सीमाओं को जानते हैं तो आप इसके आसपास/इसके साथ काम कर सकते हैं। उदाहरण कोड के लिए धन्यवाद मुझे काफी समय बचा रहा है और आपकी उत्कृष्ट पुस्तक के लिए धन्यवाद। –

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