public class A
{
int x;
float y;
}
如何在C#中查找类的大小。 有没有像Sizeof()这样的运算符,它曾经是C ++
答案 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;
}