This is mostly an understanding check, as I couldn't find a complete reference on this topic.
In C#, when I write readonly Foo myFoo
, I'm essentially saying myFoo
is a pointer to Foo
, and the pointer cannot be reassigned. To guarantee that the underlying Foo
can't be reassigned, I need a whole other class or interface ImmutableFoo
.
Now consider the construct List<Foo>
. It's basically a pointer to a list of pointers to Foo
, i.e. similar to vector<Foo *> *
in C++. There are three places where you could put const
in C++.
const vector<const Foo *> * const
So I think the equivalent of each of these is,
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
Is this table of equivalencies correct?
Yes, I think you got it. I think this const to readonly translation is correct, even if you should not compare those two keywords. I think there are many other subtly and differently behaves between the C++ const and C# readonly keyword. Some of them are:
tbc...
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With