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

时间:2015-08-11 15:56:39

标签: c# c++ const

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

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

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

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

这个等价表是否正确?

1 个答案:

答案 0 :(得分:4)

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

  • C ++中的Const更强大,请注意这个关键字意味着一对 不同背景下的不同事物。在许多情况下,在C ++中使用const是一种最佳实践。在C#中,我们不会使用那么多的不可变范例,但如果你看一下the C# Immutable Collections,趋势就会出现。
  • 在C#中,readonly并不是真正不可变的,因为你仍然可以change readonly Fields/Properties by reflection

TBC ...