Исключение SocketException: код ошибки против SocketErrorCode

#c# #sockets #error-handling

#c# #сокеты #обработка ошибок

Вопрос:

Всегда ли ErrorCode и SocketErrorCode имеют одно и то же значение, но представлены как разные типы?

Описание класса SocketException дает им в основном идентичные описания, но я не вижу явного указания на то, что они имеют одинаковое значение.

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

 if(se.SocketErrorCode == SocketError.Interrupted)
 

вместо:

 if (se.ErrorCode != 10004)
 

или

 if (se.ErrorCode != (int)SocketError.Interrupted)
 

Ответ №1:

Да, они точно такие же.

Смотрим на исходный код:

 public override int ErrorCode {
    //
    // the base class returns the HResult with this property
    // we need the Win32 Error Code, hence the override.
    //
    get {
        return NativeErrorCode;
    }
}

public SocketError SocketErrorCode {
    //
    // the base class returns the HResult with this property
    // we need the Win32 Error Code, hence the override.
    //
    get {
        return (SocketError)NativeErrorCode;
    }
}
 

Комментарии:

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