Каков наилучший способ проверить значение null в операторе Using с потоковым считывателем?

У меня есть решарпер HttpWebResponse, и StreamReader указывает, что мой httpResponse.GetResponseStream() может быть нулевым, но я не уверен в правильном синтаксисе.

using(var httpResponse = (HttpWebResponse)request.GetResponse())
{
     if (httpResponse.StatusCode == HttpStatusCode.OK)
     { 
          //This line is where Resharper Is complaining
          using (var streamReader = new StreamReader(httpResponse.GetResponseStream()))
          {
               var result = streamReader.ReadToEnd();
               ...
          }
     }
     else
     {...

проверьте это перед рукой.

Daniel A. White 17.04.2019 21:23

Помимо дубликата, скажите ReSharper заткнуться :) это бесполезное предупреждение

Camilo Terevinto 17.04.2019 21:28

Что вы подразумеваете под "лучшим способом"? Просто сравните результат с null, и если это сравнение вернет false, объект не нулевой...

Rufus L 17.04.2019 21:31

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

amd3 17.04.2019 21:53
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
4
148
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Просто убедитесь, что httpResponse.GetResponseStream() не возвращает нулевое значение:

using(var httpResponse = (HttpWebResponse)request.GetResponse())
{
    if (httpResponse.StatusCode == HttpStatusCode.OK)
    {
        var responseStream = httpResponse.GetResponseStream();
        if (responseStream != null)
        {
            // Line reached only if httpResponse.GetResponseStream() isn't null
            using (var streamReader = new StreamReader(responseStream))
            {
                var result = streamReader.ReadToEnd();
                ...
            }
        }
    }
    else
    {
        ...
    }
}

Не по теме: вы можете уменьшить ненужную вложенность, инвертируя свои утверждения if и используя return: if (responseStream == null) return;. Это поможет вам избежать страшного пирамида судьбы.

Lews Therin 17.04.2019 21:30

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

Julio E. Rodríguez Cabañas 17.04.2019 21:32

Справедливо. Хотя случай OP немного отличается, потому что у него есть предложение else (и, поскольку мы не знаем, что в нем, мы не можем сказать, можно ли удалить предложение else с помощью той же техники рефакторинга). Мой комментарий был просто в духе обмена знаниями и облегчения чтения кода. :)

Lews Therin 17.04.2019 21:36

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

Julio E. Rodríguez Cabañas 17.04.2019 21:46

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

amd3 17.04.2019 21:56

Другие вопросы по теме