Некоторые из предложений, включая первую часть принятого ответа и исходный вопрос, имеют большой потенциал для получения неверных результатов, особенно в случае исключения.
Проблема, и мы видели, что это случалось много раз, состоит в том, что когда у вас есть одно возвращаемое значение, незначительные изменения в логике метода неизменно приводят к пути через код, который не ожидался исходным автором метода и приведет к тому, что либо возвращаемая переменная будет неправильно установлена в методе несколько раз, либо не будет установлена вообще.
Определенно бывают случаи, когда вам необходимо собрать значение для возврата вызывающей стороне, а затем выполнить некоторые дополнительные задачи в следующем методе, но в целом это должно быть скорее исключением, чем правилом.
После отслеживания слишком большого количества ошибок, которые были вызваны желанием иметь единственное возвращаемое значение, наши стандарты разработки теперь диктуют, что return
будет использоваться, если это не является абсолютно необходимым, и причина этого не должна быть тщательно задокументирована в код вместе с предупреждениями для последующих модификаторов.
Дополнительным преимуществом этого подхода является то, что если логика метода модифицируется таким образом, что новый путь кода вызывает «дыру» в логике возврата, компилятор автоматически уведомит вас об этом. Использование единственного возвращаемого значения требует от разработчика визуальной проверки каждого возможного пути кода, чтобы убедиться, что ничего не пропущено.
Наконец, вместо того, чтобы иметь возвращаемое значение вне исключения, мы требуем, чтобы соответствующее значение по умолчанию было возвращено из обработчика исключения. Таким образом, становится совершенно ясно, что произойдет в случае исключения.
Итак, в нашей среде ваш код будет:
public static string PingThatAddress(string hostAddress)
{
try
{
Ping ping = new Ping();
PingReply pingreply = ping.Send(hostAddress);
if (pingreply != null && pingreply.Status.ToString() != "TimedOut")
{
return "Address: " + pingreply.Address + "\r"
+ "Roundtrip Time: " + pingreply.RoundtripTime + "\r"
+ "TTL (Time To Live): " + pingreply.Options.Ttl + "\r"
+ "Buffer Size: " + pingreply.Buffer.Length + "\r";
}
else
{
return string.Empty;
}
}
catch (Exception pingError)
{
Debug.Fail(pingError.Message + " " + pingError);
return string.Empty;
}
}