gpt4 book ai didi

c# - 为什么这个结构是可变的?什么时候可以接受可变结构?

转载 作者:IT王子 更新时间:2023-10-29 04:04:57 24 4
gpt4 key购买 nike

Eric Lippert told me I should "try to always make value types immutable" ,所以我认为我应该尝试始终使值类型不可变。

但是,我刚刚在 System.Web 程序集中发现了这个内部可变结构 System.Web.Util.SimpleBitVector32,这让我觉得一定有拥有可变结构的一个很好的理由。我猜他们这样做的原因是因为它在测试中表现更好,并且他们将其保留在内部以阻止其滥用。然而,这只是猜测。

我已经 C&P 了这个结构的源代码。是什么证明使用可变结构的设计决定是合理的?一般而言,该方法可以获得什么样的好处,这些好处何时足以证明潜在的损害是合理的?

[Serializable, StructLayout(LayoutKind.Sequential)]
internal struct SimpleBitVector32
{
private int data;
internal SimpleBitVector32(int data)
{
this.data = data;
}

internal int IntegerValue
{
get { return this.data; }
set { this.data = value; }
}

internal bool this[int bit]
{
get {
return ((this.data & bit) == bit);
}
set {
int data = this.data;
if (value) this.data = data | bit;
else this.data = data & ~bit;
}
}

internal int this[int mask, int offset]
{
get { return ((this.data & mask) >> offset); }
set { this.data = (this.data & ~mask) | (value << offset); }
}

internal void Set(int bit)
{
this.data |= bit;
}

internal void Clear(int bit)
{
this.data &= ~bit;
}
}

最佳答案

鉴于有效载荷是一个 32 位整数,我想说这很容易被写成一个不可变的结构,可能对性能没有影响。无论您是调用更改 32 位字段值的增变器方法,还是用新的 32 位结构替换 32 位结构,您仍在执行完全相同的内存操作。

可能有人想要某种类似于数组的东西(实际上只是 32 位整数中的位),所以他们决定使用索引器语法来代替不太明显的 .WithTheseBitsChanged()返回新结构的方法。由于它不会被 MS 网络团队以外的任何人直接使用,甚至可能不会被 web 团队中的很多人直接使用,我想他们在设计决策上比构建公共(public) API 的人有更多的回旋余地。

所以,不,对于性能来说可能不是这样——这可能只是一些程序员对编码风格的个人偏好,从来没有任何令人信服的理由来改变它。

如果您正在寻找设计指南,我不会花太多时间查看尚未为公众使用而完善的代码。

关于c# - 为什么这个结构是可变的?什么时候可以接受可变结构?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8108920/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com