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
这个等价表正确吗?
是的,我想你明白了。我认为这个const到readonly翻译是正确的,即使你不应该比较这两个关键字。我认为在c++的const和c#的readonly关键字之间还有许多微妙而不同的行为。其中一些是:
- c++中的
- Const更强大,注意这个关键字意味着一对在不同的环境中不同的事物。在许多情况下,在c++中使用const是某种最佳实践。在c#中,我们并没有那么多地使用不可变范式,但是如果你看一下c#不可变集合,这种趋势正在显现。
- 在c#中,只读并不是不可变的,因为你仍然可以通过反射来改变只读字段/属性。
tbc…