В этом случае компилятор обнаруживает, что s записано, но не прочитано, и сознательно подавляет предупреждение.
Причина в том, что C # - это язык для сборки мусора, хотите верьте, хотите нет.
Как вы это понимаете?
Хорошо, рассмотрим следующее.
У вас есть программа, которая вызывает метод DoIt (), который возвращает строку. У вас нет исходного кода для DoIt (), но вы хотите проверить в отладчике его возвращаемое значение.
Теперь в вашем конкретном случае вы используете DoIt () для его побочных эффектов, а не для его возвращаемого значения. Так вы говорите
DoIt(); // discard the return value
Теперь вы отлаживаете свою программу и смотрите на возвращаемое значение DoIt () и его там нет, потому что к тому времени, когда отладчик прерывает работу после вызова DoIt (), сборщик мусора может иметь уже вычистил неиспользованную строку .
На самом деле управляемый отладчик не имеет возможности «посмотреть на вещь, возвращенную предыдущим вызовом метода». Неуправляемый отладчик C ++ имеет эту функцию, поскольку он может просматривать регистр EAX, в котором все еще находится отброшенное возвращаемое значение, но вы не можете гарантировать в управляемом коде, что возвращенное значение все еще живо, если оно было отброшено.
Теперь можно утверждать, что это полезная функция и что команда отладчика должна добавить функцию, посредством которой возвращаемые значения сохраняются, если сразу после выполнения метода существует точка останова отладчика. Это было бы хорошей особенностью, но я не тот человек, чтобы просить об этом; иди спроси команду отладчика.
Что делать бедному разработчику на C #? Создайте локальную переменную, сохраните результат в локальной переменной, а затем изучите локальную переменную в отладчике. Отладчик гарантирует, что местные жители не будут собирать мусор агрессивно.
Итак, вы делаете это, и затем компилятор выдает предупреждение, что у вас есть локальный файл, который только записывается и никогда не читается , потому что выполнение чтения не является частью программы, это сидит разработчик там смотрю отладчик . Это очень раздражающий пользовательский опыт! Поэтому мы обнаруживаем ситуацию, когда непостоянное значение присваивается локальной переменной или полю , которое никогда не будет читать , и подавляем это предупреждение. Если вы измените свой код так, чтобы вместо него было написано string s = "hello";
, тогда вы начнете получать предупреждение, потому что компилятор рассуждает, ну, это не может быть тот, кто работает над ограничениями отладчика, потому что значение прямо там , где он может быть прочитан разработчиком уже без отладчика.
Это объясняет это. Есть множество других случаев, когда мы подавляем предупреждения о переменных, которые никогда не читаются; подробное изложение всех политик компилятора для того, когда мы сообщаем о предупреждениях, а когда мы не делаем, у меня заняло бы некоторое время, чтобы написать, поэтому я думаю, что я оставлю это на этом.