если утверждение происходит, когда условие ложно (System.Net) - PullRequest
0 голосов
/ 10 ноября 2019

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

Итак, у меня возникла проблема ...

Я делаю подобное приложение для обмена сообщениями на основе TcpDiscord, Teamspeak и т. д. Как вы можете видеть ниже, у меня есть функция, которая возвращает байт [], который извлекается из сетевого потока. У меня также есть оператор if / else, чтобы гарантировать, что функция не пытается извлечь данные из потока, который не подключен, поэтому у меня есть bool (подключено), которое определяет состояние подключения. Этот bool правильно обновлен, чтобы соответствовать статусу соединения. Сначала я подумал, что это может быть проблемой, но я обнаружил, что это не так.


private byte[] RecieveData(TcpClient server)
        {
            byte[] data = new byte[1024];
            if (connected)
            {
6th line ->     server.GetStream().Read(data, 0, data.Length);
                return data;
            }
            else
            {
                return null;
            }
        }

Изображение отладки (не могу добавить изображения по какой-то причине)

Мой вопрос: почему 6-я строка кода (server.GetStream (). Read (data, 0, data.Length);) выполняется, когда условие if ложно. Если вам нужно что-нибудь от меня (фото, код и т. Д.), Просто спросите! Любая помощь будет оценена. Спасибо!

Пример минимальной воспроизводимости

Клиент: В порядке выполнения

private void ServerDisconnect(TcpClient server, byte[] data) //Called from a button
    {
        connected = false;
        Server = null;
        Disconnect(server);
    }

public void Disconnect(TcpClient server)// Checks for a connection, if there is, send DISCON request to server, if not dont
    {
        if (server.Connected) SendMessage(server, DISCON, currentUser);
        connected = false;
        server.Close();
    }

private void SendMessage(TcpClient server, byte code, User user)// Uses AddMessageCode method to specify what type of request the message is.
    {
        NetworkStream stream = server.GetStream();
        byte[] data = AddMessageCode(code, ObjectToByteArray(user));//Uses a simple Binary converter to serialize a class.
        stream.Write(data, 0, data.Length);//Sends request to server
    }

private byte[] AddMessageCode(byte code, byte[] data)// Adds the byte code to the start of the data array.
    {
        byte[] newData = new byte[data.Length + 1];
        newData[0] = code;
        Array.Copy(data, 0, newData, 1, data.Length);
        return newData;
    }

Теоретически, метод нижене должно вызывать ошибку. Но это так.

private byte[] RecieveData(TcpClient server)
    {
        byte[] data = new byte[1024];
        if (server.Connected)
        {
            server.GetStream().Read(data, 0, data.Length);
            return data;
        }
        else
        {
            return null;
        }
    }

Если это все еще недостаточно ясно. Прошу прощения.

Ссылка на исходный код

1 Ответ

1 голос
/ 10 ноября 2019

В данном конкретном случае оператор if уже выполнен с условием true. Часть, которую я не понимал, заключалась в том, что метод stream.Read() ожидает получения данных для продолжения.

Если это не имеет смысла, вот аналогия с @ mjwills,

Оператор if - это дом, а дверь - это условие. Если вы вошли в дом, когда дверь была открыта ( условие было истинным ), независимо от того, открыта дверь или нет ( условие истинно или ложно ), вы находитесь в доме ( код внутри оператора if выполняется ). И в этом случае код внутри не завершается быстро, он ждет данных из потока.

Спасибо сообществу stackoverflow за помощь в понимании этого в течение 10 минут после публикации вопроса!

...