gpt4 book ai didi

c# - 只读与静态只读说明

转载 作者:太空狗 更新时间:2023-10-29 21:31:55 26 4
gpt4 key购买 nike

我遇到了一个有趣的情况,我想了解一下。我的类中有一个 readonly 结构字段。这意味着当我引用它时,它引用的是副本而不是实际副本,因此当我调用 change 方法时,它将使用副本,而原始副本将保持不变。

这不是我观察到的。我只看到静态字段的预期行为。我期望这两种类型的行为。

private struct junk
{
public int i;

public void change()
{
i += 1;
}
}

private readonly junk jk;
private static readonly junk jk2;

public Form1()
{
InitializeComponent();
jk.change();
//jk.i is now 1, why? Shouldn't it be changing a copy and not the original jk?
jk2.change();
//jk2.i is 0
}

最佳答案

I have a readonly struct field in my class. This means that when I reference it, it references a copy and not the actual one, so when I call a change method, it will be working with a copy, and the original will remain unchanged.

这根本不是 readonly 修饰符的作用。 readonly 修饰符可防止您在构造函数以外的任何地方为 jk 分配新值。然后,static 修饰符允许您独立于正在使用的 Form1 实例重用该值。
也就是说,readonlystatic 都不会产生您所描述的奇怪行为,因为您发布的代码无法重现该行为。

在控制台应用程序中查看一个更简单的示例(您可以尝试 here ):

public class Program
{
private readonly junk jk;
private static readonly junk jk2;

public static void Main()
{
var program = new Program();
program.jk.change();
Console.WriteLine(program.jk.i); // prints 0

jk2.change();
Console.WriteLine(jk2.i); // prints 0
}
}

public struct junk
{
public int i;
public void change()
{
i += 1;
}
}

然后,正如@Damien_The_Unbeliever 评论的那样,尽量避免使用可变的struct

关于c# - 只读与静态只读说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55090417/

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