如何在C#中查找类的大小

时间:2010-02-25 05:40:31

标签: c# class size

public class A
{
  int x;
  float y;
}

如何在C#中查找类的大小。 有没有像Sizeof()这样的运算符,它曾经是C ++

5 个答案:

答案 0 :(得分:22)

以下内容将为您提供C#类的大小:

Marshal.SizeOf(typeof(Myclass));

using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Sequential)]
class Myclass
{

}

记住一个类的大小取决于填充。

答案 1 :(得分:8)

简答:

你没有。

答案很长:

如果您键入的内容具有固定布局且没有托管成员,则只能这样做。结构默认是固定的。类可归因于具有固定布局。

(我不知道如何,因为你真的不需要它。只有在互操作时才这么重要。)

答案 2 :(得分:2)

您可以将类序列化为内存流,然后从那里获取大小,但除非必须,否则我不建议这样做。

答案 3 :(得分:0)

如果你使用sizeof运算符,你将获得指针的大小(显然对于所有对象都是一样的。)

您可以编写自己的方法并对所有对象的成员(或您感兴趣的成员)进行迭代(使用反射),并添加每个成员的大小。

棘手的部分将能够确定非本机类型的成员的大小...您的方法必须有点“递归”。

如果您要实现上述想法,那么您将拥有该对象的大致尺寸。

答案 4 :(得分:0)

大多数发布的解决方案都很棒且工作正常,但它们的限制是您的类必须可序列化(有关详细信息,请参阅:https://docs.microsoft.com/en-us/dotnet/standard/serialization/basic-serialization) 但是,如果您的类不可序列化,那么以下代码可能会有所帮助。 此代码考虑到使用引用字段不是免费的事实,它增加了一些开销。 它还考虑使用字符串的平均大小,以便获得更好的近似值。

    /// <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;
    }