使用结构作为基元的包装进行类型检查的开销?

时间:2011-05-30 23:01:34

标签: c#

假设我希望获得额外的类型检查,以便在语义上处理不同的原语:

public struct Apple
{
    readonly int value;

    // Add constructor + operator overloads
}

public struct Orange
{
    readonly int value;

    // Add constructor + operator overloads
}

关键是我们无法比较“apple to oranges”,所以在结构中包含实际的int意味着我们可以通过代码获得类型检查和一些额外的可读性和文档。

我的问题是:在内存和速度方面,与此相关的开销是多少?由于结构是值类型,包含这些结构的变量是32位还是更大?使用这些结构而不是基元的性能开销怎么样?运算符重载会产生很大的开销吗?

有关这方面的智慧的任何其他建议吗?

2 个答案:

答案 0 :(得分:9)

在内存中使用结构没有任何开销,您可以使用Marshal.SizeOf()来验证:

struct testStruct
{
    public readonly int value;
}
..

int size = Marshal.SizeOf(typeof(testStruct)); //returns 4

这也与sizeof(testStruct)

返回的相同
unsafe
{
    int size = sizeof(testStruct); //returns 4
}

根据MSDN,两种尺寸方法的区别在于:

  

虽然你可以使用   Marshal.SizeOf方法,值   这种方法返回的并不总是如此   与返回的值相同   的sizeof。 Marshal.SizeOf返回   类型之后的大小   marshaled,而sizeof返回   由它分配的大小   公共语言运行库,包括任何   填充。

答案 1 :(得分:2)

我可能会为此避开,但你可以做:

using Apple = System.Int32;
using Orange = System.Int32;

您将无法跨文件使用它。从技术上讲,你仍然可以将苹果与橙子进行比较。