c# '的只读与c++ '的const -等价

本文关键字:等价 const 只读 c++ | 更新日期: 2023-09-27 18:07:23

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

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

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

const vector<const Foo *> * const
  • const #1:你不能修改向量(通过调整大小,重新分配元素等)
  • const #2:你不能修改指向向量
  • 内部的Foo-s
  • const #3:不能修改指向向量
  • 的指针

所以我认为等价的是

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

这个等价表正确吗?

c# '的只读与c++ '的const -等价

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

    c++中的
  • Const更强大,注意这个关键字意味着一对在不同的环境中不同的事物。在许多情况下,在c++中使用const是某种最佳实践。在c#中,我们并没有那么多地使用不可变范式,但是如果你看一下c#不可变集合,这种趋势正在显现。
  • 在c#中,只读并不是不可变的,因为你仍然可以通过反射来改变只读字段/属性。

tbc…