在实践中,具有单个成员的C#struct是否会像在结构外部使用单个成员一样高效?

在实践中,具有单个成员的C#struct是否会像在结构外部使用单个成员一样高效?,c#,optimization,struct,C#,Optimization,Struct,我正在开发一个库,它在内部传递整数值,这些整数值不是真正的整数,而是方便的位容器 为了我自己的理智,我宁愿这样做 internal struct MyStruct { private readonly int myInt; /* Constructor and get accessors. */ } 。。。并传递MyStruct值而不是int值。这样我就可以使用我的nice get访问器,编译器将防止我使用错误的类型 我能合理地确定我这样做没有导致效率低下吗?感觉上,一旦编译器

我正在开发一个库,它在内部传递整数值,这些整数值不是真正的整数,而是方便的位容器

为了我自己的理智,我宁愿这样做

internal struct MyStruct
{
    private readonly int myInt;
    /* Constructor and get accessors. */
}
。。。并传递MyStruct值而不是int值。这样我就可以使用我的nice get访问器,编译器将防止我使用错误的类型

我能合理地确定我这样做没有导致效率低下吗?感觉上,一旦编译器完成了它的工作,MyStruct的所有用法都应该归结为一个简单的int,就像int一样占用一个寄存器


我的经验告诉我,单成员结构确实按照我希望的方式编译,但我很难将其归结为直觉以外的任何东西。

这只是半个答案:我相信你是正确的,结构成员只是结构本身的一部分,因此传递的方式与int的方式相同,因为结构和int的大小相同(尽管我无法从语言规范中找到明确的答案)

然而,让您的会员成为只读会员会带来令人惊讶的性能损失


因此,我将使您的成员成为非只读的,并且不为其创建任何变体。

不确定为什么您需要在此处使用结构,为什么不直接传递int?@DavidG Type safety和便捷的get accessors.myvalue.Flarn vs GetFlarn(myvalue)好吧,通过查看此结构的编译版本(在发布版本中)我可以告诉你,Stuct不会被编译掉……它仍然是一个带有int字段的结构。@gregkalapos你在看CIL/MSIL还是机器代码?你也可以使用扩展方法添加
get
方法。无论是C#spec还是CIL spec都不要求
struct
带有单个
int
成员具有特定的大小。值类型的大小取决于实现,并且允许填充。这是经过深思熟虑的,以提高可移植性。(实际上,它们的大小相同,并且肯定在.NET Framework上。)您可以通过显式指示布局来覆盖这一点(
StructLayoutAttribute
),尽管这对单成员结构来说当然没什么意义。