C#中的readonly与C++中的const - 相当于何物?

8

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

在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++中,const也可以应用于类方法,这是C#中不存在的概念。请参考此问题:https://dev59.com/zW865IYBdhLWcg3wduaH - Kik
1个回答

5

是的,我认为你理解对了。我认为这个将C++的const翻译成C#的readonly是正确的,尽管不应该将这两个关键字进行比较。我认为C++的const和C#的readonly关键字之间存在许多其他微妙且行为不同的差异。其中一些差异包括:

  • C++中的const更加强大,注意这个关键字在不同的上下文中有不同的含义。在许多情况下,在C++中使用const是某种最佳实践。在C#中,我们并没有那么多地使用不可变模式,但是这种趋势正在出现,如果您查看C#不可变集合
  • 在C#中,readonly并非真正的不可变,因为您仍然可以通过反射修改只读字段/属性

待续...


在C++中,您也可以更改常量。 - Daniel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接