私は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
オブジェクトを保護するメカニズムがあります(const
C ++ではreadonly
C#ではなくC#とほぼ同じですconst
)、ポインターを介してconst値を任意に変更する十分な理由がないためです。
さらに調べてみると、C#にはC ++の低レベルのconstポインターに相当するものはなく、次のようになります。
readonly int* p
C#の場合。
その場合、pはポイントされたオブジェクトのみを読み取ることができ、それに書き込むことはできません。
また、const
オブジェクトの場合、C#はアドレスを取得する試みを禁止しました。
C ++では、これを変更しようとするconst
と、コンパイルエラーまたは未定義の動作になります。C#では、これを利用できる可能性があるかどうかわかりません。
だから私の質問は:
- この動作は本当に明確ですか?C#では知っていますが、C ++にはUBのような概念はありません
- その場合、どのように使用すればよいですか?それとも使用しないのですか?
注:コメントセクション:const
C ++でのキャストキャストはこの質問には関係ありませんconst
。これは、オブジェクト自体へのポインターがでない場合にのみ有効であり、それ以外の場合はUBであるためです。さらに、私は基本的にC#とコンパイル時の動作について話しています。
質問を完全に理解していない場合は、詳細を提供するように依頼できます。私はほとんどの人がこれを正しく理解できないことを発見しました、多分それはそれを明確にしない私のせいです。