[英]Why readonly members in a struct but not in a class
C# 8.0 在结构中引入了readonly
成员(如此处所述)。 因此,例如,您可以使用以下方法:
public readonly override string ToString() => $"({X}, {Y}) is {Distance} from the origin";
此外,如果您的readonly
方法修改了结构的 state,它将无法编译——我发现这是非常有用和优雅的解决方案。 例如,在下面的示例中,如果X
和Y
是结构的属性,则以下方法将无法编译:
public readonly void Translate(int xOffset, int yOffset)
{
X += xOffset;
Y += yOffset;
}
再次,非常有用和优雅的方式来表达代码的意图。
那么为什么只能使用结构而不是类。 如果我尝试将readonly
添加到 class 中的方法,我会收到编译器错误: 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
class 的隐藏副本。 在 C# 8.0 之前,通过将整个结构vector
设为只读,可以防止隐藏副本,这在特定情况下可能会导致性能下降。 但是,如果不是整个结构是不可变的呢? 现在,借助 C# 8.0 中的新功能,可以仅将特定方法设为只读并防止编译器创建隐藏副本。 对于类和接口等引用类型,没有性能优势,因为实例是通过引用传递的,并且永远不会制作隐藏副本。 因此,将此功能添加到类和接口没有任何好处。
2.另一个原因是这是对只读结构概念的扩展,但没有只读接口或类。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.