Я пришел из 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#, а не const
в C# ), поскольку у нас нет достаточных оснований для произвольного изменения значений констант с помощью указателей.
Исследуя далее, я обнаружил, что нет эквивалента низкоуровневых константных указателей C ++ в C#, что будет выглядеть примерно так:
readonly int* p
в C#, если он у него есть.
Тогда p может только читать указанный объект и не может писать в него.
И для const
объектов C# запретил попытки получить их адрес.
В C ++ любая попытка изменить const
является либо ошибкой компиляции, либо неопределенным поведением. В C# я не знаю, есть ли вероятность, что мы сможем использовать это.
Поэтому мой вопрос:
- Является ли это поведение действительно четким ? Хотя я знаю, что в C# нет такого понятия, как UB в C ++
- . Если да, то как мне его использовать? Или никогда его не использовать?
Примечание: в разделе комментариев: отбрасывание const
в C ++ не связано с этим вопросом, потому что это действительно только тогда, когда сам указатель на объект не const
, иначе это UB. Кроме того, я в основном говорю о C# и поведении времени компиляции.
Вы можете попросить меня предоставить более подробную информацию, если вы не полностью понимаете вопрос. Я обнаружил, что большинство людей не могут понять это правильно, возможно, я виноват в том, что не объяснил это.