2010-08-31 32 views
7

मैं कुछ क्षेत्रों के साथ एक struct है किया जाना है। खेतों में से एक सामान्य प्रकार का है। सामान्य प्रकार या तो संदर्भ प्रकार या मान प्रकार हो सकता है।एक (सामान्य) मान प्रकार जबरदस्ती एक संदर्भ

मैं मजबूर करने के लिए है कि यह एक संदर्भ के रूप में आंतरिक रूप से संग्रहीत किया जाता है, कि struct बहुत बड़ा हो जाता है से बचना चाहते हैं।

struct Foo<T> 
{ 
    T field; // should be a reference 
} 

मैं मैं object या T[] इस्तेमाल कर सकते हैं पता है, लेकिन दोनों अजीब है। क्या सामान्य संदर्भ प्रकार की तरह कुछ नहीं है?

struct Foo<T> 
{ 
    Reference<T> field; 
} 

हाँ, निश्चित रूप से, मैं अपना खुद का लिख ​​सकता हूं। पर मैं से बचने के लिए कि

+0

मुझे समझ में नहीं आता कि यह समस्या कैसे हल करता है। मान लीजिए एस एक बड़ा मूल्य प्रकार है। फिर फू * एस के रूप में एक ही आकार * यदि उपयोगकर्ता तो क्यों वे भी फू के प्रदर्शन से लगता है नहीं होगा एस के प्रदर्शन के साथ ठीक है? बॉक्सिंग एस - चाहे आप ऑब्जेक्ट या अपनी खुद की कस्टम मुक्केबाजी कक्षा के साथ बॉक्स - कुल मिलाकर * अधिक * स्थान का उपयोग करेंगे क्योंकि आपको बॉक्स के लिए एस * और * स्पेस के उदाहरण के लिए स्थान होना होगा। मुक्केबाजी एस का उपयोग करेगा * अधिक * समय है क्योंकि यह एक संदर्भ प्रकार में बॉक्स करने के समय और Unbox एस –

+0

और एस रखने लेता है तो उनके के एक बहुत हैं कचरा कलेक्टर को काफी दबाव जोड़ देगा। क्या आप समझा सकते हैं कि आपको ऐसा क्यों लगता है कि यह किसी भी तरह की जीत है, क्योंकि ऐसा लगता है कि मुझे एक बुरी स्थिति बनाने की तरह लगता है - यानी, एक बड़ी संरचना की लागत लागत - बहुत दूर है। –

+0

@Eric: मैं नहीं चाहता कि संरचना बड़ी हो जाए। मेमोरी उपयोग में structs छोटे होना चाहिए। इस संरचना में अन्य क्षेत्र हैं और यह पहले से ही ऊपरी सीमा पर है। यदि टी एक ग्रिड या एक बड़ा मूल्य प्रकार होगा, तो परिणामी संरचना बड़ी होगी। –

उत्तर

2

तो धारण करने के लिए आप पूरी तरह से सुनिश्चित होने की कोशिश कर रहे हैं कि किसी भी वैल्यू टाइप को बॉक्स किया गया है, इसे ऑब्जेक्ट फ़ील्ड में स्टोर करें और सामान्य बाधा को लागू करने के लिए एक संपत्ति का उपयोग करें; यानी:

struct Example<T> 
{ 
    private object obj; 
    public T Obj 
    { 
     get 
     { 
      return (T)obj; 
     } 
     set 
     { 
      this.obj = value; 
     } 
    } 
} 
+0

हालांकि, इस संरचना का उपयोग करने के तरीके के आधार पर यह ध्यान दिया जाना चाहिए कि संरचना की कच्ची मेमोरी दो समान मानों के लिए भिन्न हो सकती है क्योंकि structs interned नहीं हैं और बक्से अलग-अलग पॉइंटर्स होंगे। बराबर विधि अभी भी प्रबंधित तुलना के लिए काम करेगी, इसलिए यह विशिष्ट प्रबंधित-> देशी संक्रमणों के लिए केवल एक चिंता है। – TheXenocide

+0

मैं सोच रहा था कि टुपल वैल्यू टाइप था, लेकिन स्पष्ट रूप से यह नहीं है, इसलिए मैं थाकोप के उत्तर की अनुशंसा करता हूं। – TheXenocide

9

परिभाषित टी एक वर्ग बनने की कोशिश कर रहा हूँ।

struct Foo<T> where T : class 
{ 
    T field; // Now it's a reference type. 
} 
+0

स्मार्ट और त्वरित .. – Dienekes

+0

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

+0

मैंने यह स्पष्ट करने के लिए प्रश्न को दोहराया। –

-1

और आप इसे एक उदाहरण होना चाहते हैं:

where T : new() 
+1

यह हमेशा एक उदाहरण या शून्य रेफरी होगा। आप नए() का उपयोग करते हैं यदि टाइप टी के ऑब्जेक्ट को रनटाइम पर टाइप टी के डिफॉल्ट कन्स्ट्रक्टर के माध्यम से तत्कालता की आवश्यकता होती है। –

3

आप Tuple<T1> उपयोग कर सकते हैं अपने मान प्रकार चर (Tuples बीसीएल में कक्षाएं हैं)

struct Foo<T> 
{ 
    Tuple<T> field; 
} 
संबंधित मुद्दे