タグ付けされた質問 「readonly-attribute」


1
ポインターを使用して読み取り専用フィールドを変更できますか?しかし、なぜ?
私はC ++の出身で、C ++とC#のポインター間で非常に異なる動作を見つけます。 意外にも、このコードはコンパイルできます...そしてさらに...完全に動作します。 class C { private readonly int x = 0; unsafe public void Edit() { fixed (int* p = &x) { *p = x + 1; } Console.WriteLine($"Value: {x}"); } } これは私を非常に困惑させます、C ++でもconstオブジェクトを保護するメカニズムがあります(constC ++ではreadonlyC#ではなくC#とほぼ同じですconst)、ポインターを介してconst値を任意に変更する十分な理由がないためです。 さらに調べてみると、C#にはC ++の低レベルのconstポインターに相当するものはなく、次のようになります。 readonly int* p C#の場合。 その場合、pはポイントされたオブジェクトのみを読み取ることができ、それに書き込むことはできません。 また、constオブジェクトの場合、C#はアドレスを取得する試みを禁止しました。 C ++では、これを変更しようとするconstと、コンパイルエラーまたは未定義の動作になります。C#では、これを利用できる可能性があるかどうかわかりません。 だから私の質問は: この動作は本当に明確ですか?C#では知っていますが、C ++にはUBのような概念はありません …
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.