为什么结构中的成员是可读的,而类中的成员却不是?

问题描述 投票:4回答:1

C# 8.0引入 readonly 结构中的成员(如 此处). 所以比如你可以有这种方法。

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# readonly c#-8.0
1个回答
1
投票

根据我的看法,有两个原因,为什么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. 另一个原因是,这是对只读结构概念的扩展,但没有只读接口或类。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.