2010-02-25 1 views
12
public class A 
{ 
    int x; 
    float y; 
} 

में कक्षा के आकार को कैसे ढूंढें सी # में कक्षा का आकार कैसे प्राप्त करें। क्या कोई ऑपरेटर जैसे Sizeof() है, जो सी ++सी #

+2

परिदृश्य में जहाँ आप स्पष्ट रूप से वर्ग के आकार पता करने की जरूरत क्या है? –

+0

आकार के आधार पर आपका क्या मतलब है? कोड की रेखाएं, कुल मेमोरी इसका उपयोग कर रही है? –

+1

@Asad बट: Google 'sizeof' – leppie

उत्तर

7

लघु जवाब:

आप नहीं है।

लांग जवाब:

आप केवल आप टाइप निश्चित लेआउट है और कोई प्रबंधित सदस्य हैं, तो ऐसा। स्ट्रक्चर डिफ़ॉल्ट रूप से तय किए जाते हैं। कक्षाओं को एक निश्चित लेआउट के लिए जिम्मेदार ठहराया जा सकता है।

(मैं दिखा रहा नहीं कैसे, क्या तुम सच में इसकी जरूरत नहीं है। यह केवल महत्वपूर्ण है जब इंटरॉप कर।)

+0

धन्यवाद लेप्पी। तो क्या हम structs के आकार को ढूंढें, क्योंकि वे ठीक हैं? – Sunil

+0

@ सुनील: हाँ, आप 'मार्शल .इज़ॉफ()' या असुरक्षित मोड 'आकार' में उपयोग कर सकते हैं। यदि आकार निर्धारित नहीं किया जा सकता है तो यह आपको एक त्रुटि देगा। – leppie

0

में उपयोग किया जाता है यदि आप sizeof ऑपरेटर का उपयोग करते हैं, तो आपको सूचक का आकार मिल जाएगा (जो सभी वस्तुओं के लिए समान होगा, जाहिर है)।

आप ऑब्जेक्ट के सभी सदस्यों (या जिन लोगों में आप रुचि रखते हैं) पर अपनी खुद की विधि और पुनरावृत्ति (प्रतिबिंब का उपयोग करके) लिख सकते हैं और प्रत्येक व्यक्तिगत सदस्य का आकार जोड़ सकते हैं।

मुश्किल हिस्सा सदस्य के आकार को निर्धारित करने में सक्षम होगा जो देशी प्रकार नहीं हैं ... आपकी विधि को कुछ हद तक "रिकर्सिव" होना होगा।

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

2

आप एक स्मृति धारा में वर्ग को क्रमानुसार और फिर वहाँ से आकार मिल सकता है, लेकिन मैं वास्तव में ऐसा करने की सिफारिश नहीं करता जब तक कि आपको यह नहीं करना पड़े।

Marshal.SizeOf(typeof(Myclass)); 

using System.Runtime.InteropServices; 

[StructLayout(LayoutKind.Sequential)] 
class Myclass 
{ 

} 

याद रखें एक वर्ग के आकार गद्दी पर निर्भर करता है:

+7

यह धारावाहिक उदाहरण का आकार होगा, जो कि उदाहरण के आकार के समान नहीं हो सकता है। –

+0

पहले ऐसा किया है।दिलचस्प अभ्यास। – jcollum

+0

ऐसा क्यों नहीं होगा? –

16

निम्नलिखित आप सी # वर्ग के आकार देना होगा।

0

तैनात समाधान के अधिकांश महान हैं और ठीक से काम पर वे प्रतिबंध यह है कि अपने वर्ग serializable (अधिक विवरण देखने के लिए: https://docs.microsoft.com/en-us/dotnet/standard/serialization/basic-serialization) होना चाहिए है लेकिन यदि आप वर्ग उसके बाद निम्न कोड सहायक हो सकता है serializable नहीं है। यह कोड इस तथ्य को ध्यान में रखता है कि संदर्भ फ़ील्ड का उपयोग करना निःशुल्क नहीं है, यह कुछ ओवरहेड जोड़ता है। यह स्ट्रिंग के लिए औसत आकार का उपयोग करने पर भी विचार करता है ताकि आपको बेहतर अनुमान मिल सके।

/// <summary> 
    /// Gets the size of object. 
    /// </summary> 
    /// <param name="obj">The object.</param> 
    /// <param name="avgStringSize">Average size of the string.</param> 
    /// <returns>An approximation of the size of the object in bytes</returns> 
    public static int GetSizeOfObject(object obj, int avgStringSize=-1) 
    { 
     int pointerSize = IntPtr.Size; 
     int size = 0; 
     Type type = obj.GetType(); 
     var info = type.GetFields(System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.Public | System.Reflection.BindingFlags.NonPublic); 
     foreach (var field in info) 
     { 
      if (field.FieldType.IsValueType) 
      { 
       size += System.Runtime.InteropServices.Marshal.SizeOf(field.FieldType); 
      } 
      else 
      { 
       size += pointerSize; 
       if (field.FieldType.IsArray) 
       { 
        var array = field.GetValue(obj) as Array; 
        if (array != null) 
        { 
         var elementType = array.GetType().GetElementType(); 
         if (elementType.IsValueType) 
         { 
          size += System.Runtime.InteropServices.Marshal.SizeOf(field.FieldType) * array.Length; 
         } 
         else 
         { 
          size += pointerSize * array.Length; 
          if (elementType == typeof(string) && avgStringSize > 0) 
          { 
           size += avgStringSize * array.Length; 
          } 
         } 
        } 
       } 
       else if (field.FieldType == typeof(string) && avgStringSize > 0) 
       { 
        size += avgStringSize; 
       } 
      } 
     } 
     return size; 
    }