繁体   English   中英

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

[英]Passing a readonly struct as an “in” parameter?

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

所以我发现微软关于如何编写安全高效的 C# 代码的建议令人困惑:

声明一个只读结构来表示一个类型是不可变的。 这使编译器能够在使用 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
 }

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

使结构只读将防止调用任何变异方法,因此将避免隐藏副本。

还有很好的 arguments 为什么可变结构是邪恶的,所以我主张只将所有结构设为只读。 IE

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); 
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2025 STACKOOM.COM