Законно ли изменять строки? - PullRequest
       28

Законно ли изменять строки?

3 голосов
/ 20 сентября 2019

Используя фиксированный оператор, можно получить указатель на строку.Используя этот указатель, они могут изменить строку.Но разрешено ли это по закону в документации C #?

using System;

class Program
{
    static void Main()
    {
        string s = "hello";
        unsafe
        {
            fixed (char* p = s)
            {
                p[1] = 'u';
            }
        }
        Console.WriteLine("hello");
        Console.Write("hello" + "\n");
        Console.ReadKey();
    }
}

// hullo
// hello

Приведенная выше программа изменяет строковый литерал.

Ответы [ 3 ]

4 голосов
/ 20 сентября 2019

В соответствии со спецификацией языка :

Изменение объектов управляемого типа с помощью фиксированных указателей может привести к [sic] в неопределенном поведении.Например, поскольку строки являются неизменяемыми, программист несет ответственность за то, чтобы символы, на которые ссылается указатель на фиксированную строку, не были изменены.

(My выделение )

Итак, это явно предусмотрено в языке, и вы не должны этого делать, но это ваша ответственность, а не ответственность компилятора.

1 голос
/ 20 сентября 2019

Слово «юридический» может быть здесь неправильным.«Неправильно» это то, что я бы сказал.Это возможно , но строки определены как неизменяемые в C #.В любом случае, изменяя одно, вы нарушаете классовые инварианты.Среда выполнения может отреагировать на это в любом случае, в зависимости от того, что ей нравится, включая «явно работающий», «падение» или «кражу информации о вашей кредитной карте для покупки тако» *.Весь смысл ключевого слова unsafe заключается в том, что вы вводите раздел своего кода, где вы говорите: «Хорошо, я знаю, что вы не можете показать, что это безопасно, но поверьте мне, я знаю, что я делаю, и это полностью так».

*: Более вероятный риск в этом конкретном случае состоит в том, что где-то между компилятором и несколькими этапами времени выполнения будет вполне оправдано при встраивании и постоянном сворачивании обращений к строковым литералам, но не других, в зависимости от небольших изменений в кодеЭто означает, что вы можете получить противоречивые результаты во время выполнения.Суть в том, что не делайте этого.

0 голосов
/ 20 сентября 2019

Юридический - это сильное слово lmao

, но да, вы можете.Не знаю, почему отказался, но я добавлю еще одну вещь, вы не используете его, если это абсолютно необходимо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...