Предложение по улучшению компилятора С#

Представьте, что кто-то кодирует следующее:

string s = "SomeString";
s.ToUpper();

Мы все знаем, что в приведенном выше примере вызов метода "ToUpper()" бессмыслен, потому что возвращенная строка не обрабатывается вообще. Но, тем не менее, многие люди делают эту ошибку и тратят время, пытаясь устранить проблему, спросив себя: "Почему неактивны персонажи на моей переменной с заглавной буквы?"

Так было бы здорово, если бы был атрибут, который может быть применен к методу "ToUpper()", который даст ошибку компилятора, если объект возврата не будет обработан? Что-то вроде следующего:

[MustHandleReturnValueAttribute]
public string ToUpper()
{
…
}

Если для корректного компиляции этого кода пользователь должен будет обрабатывать возвращаемое значение следующим образом:

string s = "SomeString";
string uppers = s.ToUpper();

Я думаю, что это сделало бы кристально понятным, что вы должны обрабатывать возвращаемое значение, иначе не будет при вызове этой функции.

В примере с строкой это может быть не очень много, но я могу придумать другие более веские причины, почему это может пригодиться.

Что вы, ребята, думаете?

Спасибо.

Ответы

Ответ 1

Можно ли вызвать метод для его побочных эффектов, для его возвращаемого значения или для обоих? "Чистые" функции (которые не имеют эффекта и служат только для вычисления возвращаемого значения) были бы хороши для аннотации как такового, как для устранения типа ошибки, которую вы описываете, так и для обеспечения возможности оптимизации или анализа. Может быть, через пять лет мы увидим, что это произойдет.

(Обратите внимание, что компилятор F # будет предупреждать в любое время, когда вы неявно игнорируете возвращаемое значение. Функция "игнорировать" может использоваться, когда вы хотите явно игнорировать ее.)

Ответ 2

Если у вас есть Resharper, он будет выделять такие вещи для вас. Cant рекомендует resharper достаточно высоко, у него много полезных дополнений IDE, особенно вокруг рефакторинга.

http://www.jetbrains.com/resharper/

Ответ 3

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

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

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

Ответ 4

Я бы предпочел использовать флаг struct или class как [Immutable] и обрабатывать это автоматически (с предупреждением) для вызванных методов без использования их возвращаемых значений на неизменяемых объектах. Это также может защитить объект компилятором от изменений после создания.

Если объект действительно является неизменяемым объектом, на самом деле не было бы способа его обработать. Он также может потенциально использоваться компиляторами для обнаружения других распространенных ошибок.

Пометка метода сама по себе кажется менее полезной для меня. Я согласен с большинством других замечаний по этому поводу. Если объект изменчивый, вызов метода может иметь другие побочные эффекты, поэтому приведенный выше код может быть абсолютно корректным.

Ответ 5

У меня есть flashbacks для put (void) для всех вызовов printf(), потому что я не мог заставить Lint заткнуться в игнорировании возвращаемого значения.

Тем не менее, похоже, что эта функциональность должна быть в некотором инструменте проверки кода, а не в самом компиляторе.

Ответ 6

По крайней мере, компилятор-предупреждение будет полезно. Возможно, они добавляют что-то подобное для С# 4.0 (Design-By-Contract).

Ответ 7

Это не гарантирует предупреждение или прагму. Слишком много мест, где предполагается отбросить результат, и мне было бы очень неприятно получать предупреждение/ошибку от компилятора только потому, что метод был украшен некоторым атрибутом dodge.

Этот вид "предупреждения" должен быть аннотирован в редакторе IDE, как маленький значок на желобе "Предупреждение: отбрасывание возвращаемого значения" или тому подобное.