Подтвердить что ты не робот

С# - Как указать, когда намеренно игнорирует возвращаемое значение

В некоторых ситуациях, использующих C/С++, я могу синтаксически указать компилятору, что возвращаемое значение намеренно игнорируется:

int SomeOperation()
{
    // Do the operation

    return report_id;
}

int main()
{
    // We execute the operation, but in this particular context we
    // have no use of the report id returned.
    (void)SomeOperation();
}

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

Насколько я знаю, компилятор С# не будет жаловаться на неявно проигнорированные значения returnvalues, но я хотел бы знать, есть ли подобное соглашение для использования, чтобы сделать четкое указание другим разработчикам.

EDIT:

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

Реальный пример .NET.NET(с которого я, возможно, должен был задать вопрос с самого начала), является перегрузкой Mutex:: WaitOne(), которая не принимает аргументов. Он будет возвращаться только в том случае, если мьютекс был безопасно приобретен, иначе он никогда не вернется. Возвращаемое значение boolean для других перегрузок, где вы можете не иметь мьютекса, когда он вернется.

Итак, по моим рассуждениям, я хотел бы указать в своем многопоточном коде, что я сделал выбор, чтобы игнорировать возврат:

Mutex mtx = new Mutex();
(void)mtx.WaitOne();

Так как returnvalue никогда не может быть ничего, кроме "true".

4b9b3361

Ответ 1

Я могу только думать об одной ситуации, когда "возвращаемое значение" не допускается игнорировать в С#: когда произошла ошибка. Это должно быть предусмотрено путем исключения исключений, что делает невозможным игнорирование.

В других случаях он (или лучше: должен быть) полностью безопасен и вообще не вонючий, чтобы игнорировать возвращаемые значения.

EDIT:

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

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

Я забыл случай?

Ответ 2

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

SomeMethod(); // return value ignored - $REASON

Ответ 3

Компилятор Microsoft С# не генерирует предупреждение при игнорировании возвратов. Это не нужно, поскольку есть сборщик мусора, поэтому утечки памяти не произойдет из-за игнорирования возвращенных объектов (если они, конечно, не IDisposable). Следовательно, нет необходимости явно "переопределять" компилятор.

EDIT: Кроме того, я считаю, что проблема "ремонтопригодности" больше похожа на проблему с документацией и именованием. Я понимаю, что это был только пример, но вы не ожидали, что метод под названием SomeOperation должен вернуть ReportId. Однако вы ожидаете, что метод GetReportId вернет ReportId без большого количества побочных эффектов. В самом деле, игнорирование возвращаемого значения метода под названием GetReportId было бы довольно странным. Поэтому убедитесь, что вы хорошо назовете свои методы, и люди не будут сомневаться в эффектах ваших вызовов функций.

EDIT 2: В этом примере мьютексов я считаю, что правильное использование фактически не будет игнорировать возвращаемое значение. Даже если текущая реализация никогда не вернет false, я думаю, что хорошей практикой по-прежнему проверять возвращаемое значение, на всякий случай, когда вы в конечном итоге будете использовать другую реализацию или измените поведение в будущей версии .NET Framework или что-то:

if (mutex.WaitOne())
{
   // Your code here
}
else
{
   // Optionally, some error handling here
}

Ответ 4

object dummy = JustDontCare();

Ответ 5

Нет стандартных соглашений, о которых я знаю.

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

Ответ 6

Иногда полезно иметь возможность ввести (void), чтобы указать будущему кодеру, который смотрит на код, который вы прекрасно знаете, он что-то возвращает, и вы намеренно игнорируете его.

Тем не менее, компилятор С# будет ошибкой в ​​синтаксисе.

Ответ 7

Я видел:

var notUsed = SomeOperation();

Не очень люблю это, хотя.

Ответ 8

Соглашение в .Net заключается в том, что если вы не храните и не используете возвращаемое значение, что означает, что вы игнорируете его неявно, нет явного соглашения, и API обычно разрабатывается так, чтобы возвращаемые значения обычно игнорировались, за исключением логических значений, представляющих неудачу, состояние успеха.

Но даже в случае возвращаемых значений Boolean, представляющих статус успеха/отказа, соглашение заключается в том, что если вы игнорируете возвращаемое значение (не используйте его), это означает, что код не зависит от состояния успеха предыдущего вызова.