Я видел этот фрагмент кода:
var request = (HttpWebRequest) WebRequest.Create("http://www.google.com");
Зачем нужно кастовать (HttpWebRequest)
? Почему бы просто не использовать HttpWebRequest.Create
? А почему делает HttpWebRequest.Create
а WebRequest
, а не а HttpWebRequest
?
c#
httpwebrequest
Неизвестно
источник
источник
Ответы:
Create
Метод является статическим, и существует толькоWebRequest
. Вызов его какHttpWebRequest.Create
может выглядеть иначе, но на самом деле он скомпилирован до вызоваWebRequest.Create
. Только кажется, что он включенHttpWebRequest
из-за наследования.Create
Метод внутренне использует шаблон фабрики , чтобы сделать фактическое создание объектов, основанный наUri
вы передаете в него. Фактически вы можете получить обратно другие объекты, такие какFtpWebRequest
илиFileWebRequest
, в зависимости отUri
.источник
WebRequest.CreateHttp
находится в 4.5WebRequest
- это абстрактный класс, который имеет фабричный метод,Create
который, в зависимости от переданного URL-адреса, создает экземпляр конкретного подкласса. Нужны вы или хотите,HttpWebRequest httpreq = (HttpWebRequest)WebRequest.Create(strUrl);
а неWebRequest req = WebRequest.Create(strUrl);
зависит от ваших потребностей и от того, какие URL-адреса вы передаете.Если вы передаете только URL-адреса HTTP:, тогда предыдущий код позволяет вам получить доступ к свойствам и методам, которые подкласс
HttpWebRequest
реализует в дополнение к тем, которые определены в базовом классеWebRequest
. Но если вы передали URL-адрес FTP :, попытка преобразованияHttpWebRequest
завершится неудачей.Последний является общим и не даст сбоев ни для одного из типов поддерживаемых URL-адресов, но, конечно, без преобразования в какой-либо подкласс вы можете получить доступ только к свойствам и методам, которые определяет базовый класс.
- через Мартина Хоннена
источник
Приведение необходимо только тогда, когда вам нужен доступ к членам, уникальным для HttpWebRequest. Идея состоит в том, что если свойств / методов, поддерживаемых в WebRequest, достаточно, то вы можете написать приложение, которое будет работать со многими типами протоколов запроса / ответа. В этом случае URI может быть чем-то заданным пользователем с использованием любого протокола, поддерживаемого подключаемыми протоколами. Новые протоколы могут поддерживаться даже без изменения исходного программного обеспечения.
Если вашему приложению требуется больший контроль над функциями, специфичными для конкретного протокола, вы можете ограничить requestUri своей поддерживаемой схемой (ами) и передать WebRequest соответствующему подклассу, зависящему от протокола. Это ограничивает протоколы, поддерживаемые вашим приложением, но позволяет настраивать специфические для протокола функции.
источник