2012-01-23 8 views
27

Tôi nhận được cảnh báo này trên response.GetResponseStream() Tôi nên xử lý điều này như thế nào?Resharper: Có thể gán null cho thực thể được đánh dấu bằng thuộc tính chưa được đánh số

// Get response 
using (var response = request.GetResponse() as HttpWebResponse) 
{ 
    // Get the response stream 
    if (response != null) 
    { 
     var reader = new StreamReader(response.GetResponseStream()); 
     var responseString = reader.ReadToEnd(); 
     return responseString; 
    } 
} 

Để rõ ràng dựa trên số câu trả lời hiểu sai:

Dòng này là không nơi cảnh báo đang diễn ra:

using (var response = request.GetResponse() as HttpWebResponse) 

này dòng nơi cảnh báo đang diễn ra :

var reader = new StreamReader(response.GetResponseStream()); 
+0

Tại sao không đơn giản để Resharper sửa chữa nó cho bạn? –

+0

** Bỏ qua ** lần này là – gdoron

+7

@Uwe Resharper không biết cách "sửa lỗi" – katit

Trả lời

26
var reader = new StreamReader(response.GetResponseStream()); 

Tôi nghi ngờ tham số StreamReader của hàm tạo có thuộc tính notnull. Hãy thử các cách sau:

var stream = response.GetResponseStream(); 
if (stream == null) 
    // throw an exception 
var reader = new StreamReader(stream); 
7

Cố gắng rút ngắn mã của bạn và gói nguồn lực dùng một lần trong using báo cáo:

using (var response = request.GetResponse()) 
using (var reader = new StreamReader(response.GetResponseStream())) 
{ 
    return reader.ReadToEnd(); 
} 

hoặc thậm chí hơn nữa:

using (var client = new WebClient()) 
{ 
    return client.DownloadString("http://foo.bar.com/") 
} 
+1

Tôi không biết 'C#' nhiều nhưng sẽ 'sử dụng (var reader = new StreamReader (response.GetResponseStream()))' không nhận được cảnh báo resharper tương tự? –

1

Nếu đối tượng response là loại HttpWebRequest, sau đó trả lời sẽ luôn là loại HttpWebResponse . Nếu không, thì sẽ không bao giờ.

Hoặc bạn đang kiểm tra điều này ở sai địa điểm (tại sao gọi .GetResponse() nếu bạn có thể vượt qua một lớp khác bắt nguồn từ WebRequest chỉ để vứt bỏ kết quả) hoặc kiểm tra không cần thiết mà không có hiệu lực.

Tôi đoán việc chia sẻ lại đáng lo ngại về điều đó, mặc dù thử nghiệm cho giá trị rỗng bên dưới nó. Tôi muốn đi cho hoặc là một diễn viên trực tiếp:

using (var response = (HttpWebResponse)request.GetResponse()) 
using(var reader = new StreamReader(response.GetResponseStream())) 
    return reader.ReadToEnd(); 

Hoặc, xem xét bạn không sử dụng bất kỳ thành viên của HttpWebResponse mà không có nguồn gốc từ WebResponse, không có dàn diễn viên tại tất cả:

using (var response = (HttpWebResponse)request.GetResponse()) 
using(var reader = new StreamReader(response.GetResponseStream())) 
    return reader.ReadToEnd();