微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

将只读结构作为“in”参数传递?

如何解决将只读结构作为“in”参数传递?

根据 in 参数修饰符的所有已知规律,任何传递的对象都将通过引用传递,但不能被调用方法修改

因此,我发现 Microsoft 在 How to write safe and efficient C# code 上的建议令人困惑:

声明一个只读结构体来表示一个类型是不可变的。这使编译器能够在使用 in 参数时保存防御性副本。

永远不要将结构作为 in 参数传递,除非它是用 readonly 修饰符声明的,或者方法调用结构的只读成员。违反此指南可能会对性能产生负面影响,并可能导致模糊的行为。

如果不允许方法修改它,为什么编译器会在使用“in”参数时保存防御性副本?

如果不允许方法修改它,将非只读结构作为 in 参数传递如何会对性能产生负面影响并导致模糊的行为?

解决方法

例如:

public struct Test
{
    public int Value;
    public void SetValue(int value) => Value = value;
}
public static void Method(in Test test)
{
     test.SetValue(5);
     Console.WriteLine(test.Value); // 0
 }

这将编译得很好。如果我正确理解这种情况,则不会在调用构造函数时创建副本,而是在调用任何可能改变该值的方法时创建副本。

将结构设为只读将防止调用任何变异方法,从而避免隐藏副本。

还有good arguments for why mutable structs are evil,所以我主张只将所有结构设为只读。即

public readonly struct Test
{
    public int Value { get; }
    public Test(int v) => Value = v;
    // Any "mutating" method should create a copy instead
    public Test WithValue(int v) => new Test(v); 
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。