2009-03-09 2 views
13

Представьте кого кодирования следующее:компилятора C# Enhancement Предложение

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

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

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

[MustHandleReturnValueAttribute] 
public string ToUpper() 
{ 
… 
} 

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

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

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

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

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

Спасибо.

+0

Я сделал это раньше, +1 –

+0

@Rene: valid point, +1 – Codex

ответ

8

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

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

+0

Обобщение понятия «чистоты» было бы хорошим, потому что тогда компилятор мог бы оптимизировать больше. Подобно ключевому слову C++ const, действительно. – Thomas

+0

Кроме того, добавление аннотации [Pure] позволит решить проблемы, о которых люди говорят ниже, где они называют функции, и не заботятся о побочных эффектах. Я предполагаю, что это то, что автор действительно получал. – Mason

0

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

+0

Я бы предпочел предупреждение об ошибке. Если вы просто бросаете код вместе, вы бы не хотели, чтобы это мешало вам запускать код, например. – Andy

+0

Дизайн по контракту - это предварительные условия, постусловия и инварианты. Не о настройке условий о том, как возвращаемые значения могут/должны использоваться. –

0

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

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

2

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

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

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

+0

Добавление атрибута будет немного, но я не понимаю, почему компилятор не может дать предупреждение «Код не имеет эффекта». –

+0

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

+0

bool DoStuff() {doStuff(); if (success) возвращает true; return false; } Теперь, когда вы вызываете DoStuff(), могут быть моменты, когда меня не волнует успех или неудача. Нет необходимости проверять результаты, даже считая, что они возвращены. В других случаях, конечно, мне все равно. – andleer

6

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

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

1

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

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

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

1

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

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

Смежные вопросы