C# 的 readonly 与 C++ 的 const - 等价物

C#'s readonly vs C++'s const - Equivalents

这主要是一个理解检查,因为我找不到关于这个主题的完整参考。

在 C# 中,当我写 readonly Foo myFoo 时,我实际上是在说 myFoo 是指向 Foo 的指针,而 指针 不能重新分配。为了保证底层 Foo 不能被重新分配,我需要一个完整的其他 class 或接口 ImmutableFoo.

现在考虑构造 List<Foo>。它基本上是指向指向 Foo 的指针列表的指针,即类似于 C++ 中的 vector<Foo *> *。在 C++ 中,可以在三个地方放置 const

const vector<const Foo *> * const

所以我认为每一个的等价物是,

List<Foo>               = vector<Foo *> *             // No consts
ReadOnlyCollection<Foo> = const vector<Foo *> *       // First const toggled
List<ImmutableFoo>      = vector<const Foo *> *       // Second const toggled
readonly List<Foo>      = vector<Foo *> * const       // Third const toggled

readonly ReadOnlyCollection<ImmutableFoo>
                        = const vector<const Foo *> * const // All consts toggled

这个 table 等价关系是否正确?

是的,我想你明白了。我认为这个 constreadonly translation 是正确的,即使你 不应该比较这两个关键字。我认为 C++ const 和 C# readonly 关键字之间还有许多其他微妙且不同的行为。其中一些是:

  • C++中的const比较强大,注意这个关键字是couple的意思 不同语境下的不同事物。在许多情况下,在 C++ 中使用 const 是某种最佳实践。在 C# 中,我们并没有那么多地使用不可变范例,但趋势正在显现,如果你看一下 the C# Immutable Collections.
  • 在 C# 中,readonly 并不是真正不可变的,因为您仍然可以 change readonly Fields/Properties by reflection

待定...