1

나는 앤디 흔들기에 의해 게시물에서이 코드를 적용 (그냥 "어떤 남자"아니다 - 그는 MS 보도에 대해 "MS .NET Compact Framework에서"를 썼다 공동) :왜 WebRequest/HttpWebRequest 객체에 캐스트가 필요하고 다른 시간이 필요하지 않습니까?

WebRequest request = HttpWebRequest.Create(uri); 
request.Method = Enum.ToObject(typeof(HttpMethods), method).ToString(); 
request.ContentType = contentType; 
((HttpWebRequest)request).Accept = contentType; 
((HttpWebRequest)request).KeepAlive = false; 
((HttpWebRequest)request).ProtocolVersion = HttpVersion.Version10; 

if (method != HttpMethods.GET && method != HttpMethods.DELETE) 
{ 
    Encoding encoding = Encoding.UTF8; 
    request.ContentLength = encoding.GetByteCount(data); 
    //request.ContentType = contentType; <= redundant; set above 
    request.GetRequestStream().Write(
     encoding.GetBytes(data), 0, (int)request.ContentLength); 
    request.GetRequestStream().Close(); 
} 

참고 어떻게 처음에 내가 요청한 것을 HttpWebRequest로 캐스팅해야했던 코드 블록; 조건부 내에서, 주조는 불필요합니다. 차이점은 무엇입니까? 대신 "WebRequest"가 "HttpWebRequest"여야합니까? 그렇게하면 주조물이 회색으로 표시되어 불필요하다는 것을 알 수 있습니다. 그러나 Wiggly가 이유 때문에 그런 작업을 수행 했음에 틀림 없습니다. 왜 주조가 조건부 블록에서 왜 제거 되었습니까?

답변

3

HttpWebRequest.Create()는 일종의 정적 팩토리입니다. 파생 클래스에서 비헤이비어를 재정의 할 수 없습니다. 제공하는 URI에 따라 HttpWebRequest 또는 FtpWebRequest를 만들 수 있습니다. 어떤 WebRequest에서 파생됩니다. 당신이 파생 클래스의 특별한 속성/메서드에 액세스 할 때
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri)

또는

var request = (HttpWebRequest)WebRequest.Create(uri)

: 당신이 HTTP 요청을 만드는 알고 때, 난 당신이 다음과 같이 제안 기본 클래스에서 사용할 수없는 경우이 캐스트를 수행해야합니다.

KeepAlive은 HttpWebRequest에 속하므로 WebRequest 기본 클래스에서 사용할 수 없습니다.

Method과 같은 기타 속성은 기본 클래스에 정의되어 있으므로 캐스트가 필요하지 않습니다.

관련 문제