पहले, वास्तविक सवाल से पहले एक छोटे से अस्वीकरण:आकार (टी) और असुरक्षित .izeOf <T>() के बीच क्या अंतर है? सब से
मैं जानता हूँ कि बंद के एक बहुत देखते हैं/
sizeof
ऑपरेटर औरMarshal.SizeOf<T>
विधि के बीच अंतर के बारे में सवाल नकल, और मैं के बीच अंतर समझना है दो। यहाँ मैं नईUnsafe
वर्ग
तो में SizeOf<T>
विधि के बारे में बात कर रहा हूँ, मुझे यकीन है कि मैं इन दो आपरेशन के बीच वास्तविक अंतर को समझते हैं, और नहीं कर रहा हूँ वहाँ एक विशिष्ट अंतर है कि जब कोई struct पर विधि का उपयोग/विशेष रूप से वर्ग।
sizeof
ऑपरेटर एक प्रकार नाम लेता है और कामयाब बाइट्स यह जब आवंटित लेने के लिए माना जाता है की संख्या देता है (यानी। एक Int32
4 वापस आ जाएगी, उदाहरण के लिए)।
दूसरी ओर Unsafe.SizeOf<T>
विधि, Unsafe
कक्षा में सभी अन्य तरीकों की तरह आईएल में कार्यान्वित किया जाता है, और कोड यहाँ पर देख रहे हैं कि वह क्या करता है:,
.method public hidebysig static int32 SizeOf<T>() cil managed aggressiveinlining
{
.custom instance void System.Runtime.Versioning.NonVersionableAttribute::.ctor() = (01 00 00 00)
.maxstack 1
sizeof !!T
ret
}
अब अगर मैं नहीं कर रहा हूँ गलत, कोड सिर्फ sizeof !!T
पर कॉल कर रहा है जो sizeof(T)
जैसा है (sizeof
ऑपरेटर को टाइप नाम T
के साथ कॉल करना), तो क्या उनमें से दो बिल्कुल बराबर नहीं होंगे?
इसके अलावा, मुझे लगता है कि यह विधि पहली पंक्ति में एक बेकार वस्तु (NonVersionableAttribute
) आवंटित कर रही है, तो क्या इससे थोड़ी मात्रा में स्मृति को ढेर-आवंटित नहीं किया जाएगा?
मेरा प्रश्न है:
यह कहना सुरक्षित है कि दो तरीकों पूरी तरह से बराबर हैं और इसलिए यह, क्लासिक
sizeof
ऑपरेटर का उपयोग करने के रूप में वह भी में उस विशेषता के आवंटन से बचने के सिर्फ बेहतर है हैSizeOf<T>
विधि? क्या यहSizeOf<T>
विधि इस बिंदु पर सुविधा के लिएUnsafe
कक्षा में जोड़ा गया था?
'.custom' बयान सिर्फ आपको बताता है कि एक कस्टम-विशेषता इस विधि से संबंधित वर्तमान नहीं है। चूंकि कस्टम-विशेषताएं केवल मेटाडेटा हैं, वे नियमित विधि कॉल में शामिल नहीं हैं। – thehennyy
बस एक स्पष्टीकरण, क्या यह एक बीसीएल वर्ग है जिसे मैं अनजान हूं, या कुछ [तृतीय पक्ष एक्सटेंशन] (https://github.com/DotNetCross/Memory.Unsafe)? आप सही हैं कि यह कुछ भी नहीं करता है, शायद विचार भविष्य में कुछ क्रॉस-प्लेटफार्म जादूगर के लिए "हुक" प्रदान करना था? – Groo
@ ग्रूओ यह एक नई कक्षा है जिसे CoreFX में जोड़ा गया है। मुझे .NET कोर 2.0 के साथ विश्वास है (बिल्कुल यकीन नहीं है, लेकिन यह .NET कोर 2.0 में वैसे भी है)। यहां देखें: https://docs.microsoft.com/it-it/dotnet/api/system.runtime.compilerservices.unsafe?view=netcore-2.0 – Sergio0694