你能确定一般类型的大小吗?

时间:2018-03-09 02:56:40

标签: c#

有没有办法让sizeof()成为通用类型? e.g。

public int GetSize<T>()
{
    return sizeof(T); //this wont work because T isn't assigned but is there a way to do this
}

正如在例子中所说,以上是不可能的,但有没有办法让它工作?尝试做public unsafe int,但它没有改变任何东西。真的不想做像

这样的事情
public int GetSize<T>()
{
    if (typeof(T) == typeof(byte) || typeof(T) == typeof(sbyte))
    {
        return 1;
    }
    else if (typeof(T) == typeof(short) || typeof(T) == typeof(ushort) || typeof(T) == typeof(char))
    {
        return 2;
    }
    //and so on.
}

1 个答案:

答案 0 :(得分:1)

您可以使用

Marshal.SizeOf(typeof(T));

请注意,如果你滥用它会导致各种意想不到的结果。

也许,您可以对通用方法限制约束Types对您有意义,例如intlong,等等

还要警惕这样的事情Marshal.SizeoOf(typeof(char)) == 1.

<强>更新

正如 MickD 在他的评论中发布的那样,(并且不出所料)编译器向导 Eric Lippert 在一些更精细的点上发表了博客文章

What’s the difference? sizeof and Marshal.SizeOf

<强>更新

另外,正如 MickD 指出的那样,为了明确任何年轻的Jedi阅读,Marshal.SizeOf会返回非托管大小。

Marshal.SizeOf Method (Type)

  

以字节为单位返回非托管类型的大小。

     

返回的大小是非托管类型的大小。无人管理和   对象的托管大小可以不同。对于字符类型,大小   受应用于该类的CharSet值的影响。