c# - 为什么只读成员在结构中而不是在类中

标签 c# readonly c#-8.0

C# 8.0 引入 readonly结构中的成员(如 here 所述)。例如,您可以使用此方法:

public readonly override string ToString() => $"({X}, {Y}) is {Distance} from the origin";

另外,如果您的 readonly方法修改它不会编译的结构的状态 - 我发现这是非常有用和优雅的解决方案。例如,在下面的示例中,如果 XY是结构的属性,以下方法将无法编译:
public readonly void Translate(int xOffset, int yOffset)
{
    X += xOffset;
    Y += yOffset;
}

再次,非常有用和优雅的方式来表达代码的意图。

为什么那么它只能用结构而不是类。如果我尝试添加 readonly到类中的方法,我收到编译器错误:The modifier 'readonly' is not valid for this item.
具有只读方法没有意义的引用类型是否有任何限制?

最佳答案

在我看来,C# 8.0 只提供 read-only 的原因有两个。结构的成员:
1. 结构是值类型 .当您调用方法并将结构作为参数传递时,编译器会创建结构实例的深拷贝。如documentation显示:

public static class MyClass
{
    public static float ExistingBehavior(in Vector2 vector)
    {
        return vector.GetLength();
    }

    public static float ReadonlyBehavior(in Vector2 vector)
    {
        return vector.GetLengthReadonly();
    }
}

在这里,vector是一个结构。默认情况下,调用方法时ExistingBehavior ,编译器会创建 vector 的隐藏副本类(class)。在 C# 8.0 之前,通过制作整个结构 vector只读,将阻止隐藏副本,这在特定情况下可能会导致 性能优势 .但是,如果不是整个结构都是不可变的呢?现在,使用 C# 8.0 中的新功能,可以只将特定方法设为只读,并防止编译器创建隐藏副本。对于像类和接口(interface)这样的引用类型,没有性能优势,因为实例是通过引用传递的,并且从不制作隐藏副本。因此,将此功能添加到类和接口(interface)中没有任何好处。
2.还有一个原因是这是对只读结构概念的扩展,但没有只读接口(interface)或类。

关于c# - 为什么只读成员在结构中而不是在类中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61542120/

相关文章:

c# - 从异步方法返回IAsyncEnumerable

c# - 如何在C#中以编程方式控制VLC?

c# - 如何在 C# 中使用 1 Console.Writeline() 编写两个字符串及其两个变量值

c# - 只读字段作为子类构造函数的目标

c# - 创建完整的只读对象列表的最佳方法

具有一些只读行的 WPF Datagrid

c# - 如何强制 IAsyncEnumerable 遵守 CancellationToken

c# - [抽象类] 类型的接口(interface)属性是否可以在 C# 中实现为具体类?

c# - 将 DataRow 中的字符串转换为 double

c# - "No Value given for one or more parameters"与 C#