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

public class A { int x; float y; } 

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

简短回答:

你不。

答案很长:

如果您键入的内容具有固定布局且没有托管成员,则只能执行此操作。 结构默认是固定的。 类可以归因于具有固定布局。

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

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

 Marshal.SizeOf(typeof(Myclass)); using System.Runtime.InteropServices; [StructLayout(LayoutKind.Sequential)] class Myclass { } 

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

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

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

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

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

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

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

  ///  /// Gets the size of object. ///  /// The object. /// Average size of the string. /// An approximation of the size of the object in bytes 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; }