C# 8.0引入 readonly
结构中的成员(如 此处). 所以比如你可以有这种方法。
public readonly override string ToString() => $"({X}, {Y}) is {Distance} from the origin";
另外,如果你的 readonly
方法修改结构的一个状态,它不会被编译--我觉得这是很有用和优雅的解决方案。例如,在下面的例子中,如果 X
和 Y
是一个结构的属性,下面的方法将不会编译。
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. 结构是价值类型. 当你调用一个方法并传递结构作为参数时,编译器会创建一个结构实例的深度拷贝。由于 文件 显示。
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
类。在C# 8.0之前,通过将整个结构的 vector
只读,将防止隐藏的拷贝,这在特定情况下会导致 性能优势. 但是,如果不是整个结构是不可变的呢?现在,通过C# 8.0的新特性,可以只将一个特定的方法变成只读,并防止编译器创建一个隐藏的副本。对于像类和接口这样的引用类型,由于实例是通过引用传递的,永远不会产生隐藏的副本,因此在性能上没有任何优势。因此,对类和接口增加这个功能没有好处。2. 另一个原因是,这是对只读结构概念的扩展,但没有只读接口或类。