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

Mik*_*ike 20 c#

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

public struct Apple
{
    readonly int value;

    // Add constructor + operator overloads
}

public struct Orange
{
    readonly int value;

    // Add constructor + operator overloads
}
Run Code Online (Sandbox Code Playgroud)

关键是我们无法比较"苹果与橙子",因此在结构中包含实际的int意味着我们可以通过代码获得类型检查和一些额外的可读性和文档.

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

关于这样做的智慧的任何其他建议?

Bro*_*ass 9

在内存中使用可以使用Marshal.SizeOf()以下方法验证的结构没有开销 :

struct testStruct
{
    public readonly int value;
}
..

int size = Marshal.SizeOf(typeof(testStruct)); //returns 4
Run Code Online (Sandbox Code Playgroud)

这也与返回的相同sizeof(testStruct):

unsafe
{
    int size = sizeof(testStruct); //returns 4
}
Run Code Online (Sandbox Code Playgroud)

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

虽然您可以使用Marshal.SizeOf方法,但此方法返回的值并不总是与sizeof返回的值相同.Marshal.SizeOf在封送类型后返回大小,而sizeof返回公共语言运行库分配的大小,包括任何填充.