C#的readonly vs C++的const - Equivalents

jca*_*cai 8 c# c++ const

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

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

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

const vector<const Foo *> * const
Run Code Online (Sandbox Code Playgroud)
  • 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
Run Code Online (Sandbox Code Playgroud)

这个等价表是否正确?

Dav*_*ner 5

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

  • C++ 中的 Const 更强大,请注意该关键字在不同的上下文中表示不同的含义。在许多情况下,在 C++ 中使用 const 是某种最佳实践。在 C# 中,我们不太使用不可变范例,但如果您看一下C# 不可变集合,这种趋势正在显现。
  • 在 C# 中,readonly 并不是真正不可变的,因为您仍然可以通过反射更改 readonly 字段/属性

待定...