मैंने fact पर ठोकर खाई कि सूचकांक this[int index] { get; }
structs की सूची के लिए structs की एक सरणी के लिए अलग-अलग काम करता है। अर्थात्, T[]
के मामले में सूचकांक सरणी के भीतर तत्व का संदर्भ देता है जबकि List<T>
के मामले में सूचकांक तत्व की एक प्रति देता है।ऐरे इंडेक्सर हस्ताक्षर ऑब्जेक्ट देता है - क्या यह बॉक्स करता है?
यह एक बहुत बड़ा अर्थपूर्ण और प्रदर्शन अंतर है, और मुझे खुशी है कि T[]
हमें List<T>
की प्रदर्शन सीमा के आसपास काम करने की अनुमति देता है।
हालांकि, मैं वास्तविक कार्यान्वयन से परेशान हूं। .net संदर्भ स्रोतों में Array
के लिए code इस प्रकार लिखा है:
Object IList.this[int index] {
get { return GetValue(index); }
set { SetValue(value, index); }
}
कहाँ GetValue
के रूप में परिभाषित किया गया है इस प्रकार है:
public unsafe Object GetValue(int index)
{
if (Rank != 1)
throw new ArgumentException(Environment.GetResourceString("Arg_Need1DArray"));
Contract.EndContractBlock();
TypedReference elemref = new TypedReference();
InternalGetReference(&elemref, 1, &index);
return TypedReference.InternalToObject(&elemref);
}
इंडेक्सर की वापसी प्रकार Object
है, जिसका अर्थ है कि मुक्केबाजी को होगा।
तो मेरा सवाल यह है कि, क्या मैं निश्चित हो सकता हूं कि कोई बॉक्सिंग तब नहीं होगी जब मैं T[]
के तत्व तक पहुंचूं जहां T
एक संरचना है?
मुझे लगता है कि संकलक और/या सीएलआर विशेष रूप से ऐरे का इलाज करते हैं, और वास्तव में सूचकांक के हस्ताक्षर से परेशान नहीं हैं। क्या ये सही है? क्या इस बारे में कहीं अधिक चर्चा है?
'IList.SomeMethod' एक [अंतर्निहित intefrace] है (http://stackoverflow.com/q/143405/1997232) कार्यान्वयन। यह कहने का एक तरीका है * "यह विधि मौजूद है यदि ऑब्जेक्ट को 'IList'' * के रूप में वर्गीकृत किया गया है। इसका उपयोग केवल तभी किया जाएगा जब आप विशेष रूप से अनुरोध करते हैं, उदा। इंडेक्सर के मामले में ((IList) someArray) [x] '। सरणी इंडेक्सर को सीधे एक्सेस करना (उदा। 'SomeArray [x] ') एक और बात है, आपको किसी भी विधि के लिए स्रोत नहीं मिलेगा क्योंकि कोई भी नहीं है। – Sinatr