2012-01-19 9 views
1

我試圖讓我的頭部圍繞我的一些前輩代碼,他們幫助地使用'var'來聲明一切。如何使用System.Net.ConnectStream?

我有一個using語句,低於:

using (var postStream = request.GetRequestStream()) 
{ 
    postStream.Write(byteData, 0, byteData.Length); 
} 

當我把一個斷點在這裏,postStream在汽車窗口System.Net.ConnectStream顯示出來。我想用'Co​​nnectStream'代替'var',但編譯器不喜歡這樣。

我缺少什麼,爲什麼我不能寫我這樣的代碼:

using (ConnectStream postStream = request.GetRequestStream()) 
{ 
    postStream.Write(byteData, 0, byteData.Length); 
} 

我知道這是微不足道的,但我總是被告知,除非你有特殊原因,不使用「無功」這樣做(如在處理LINQ時)。我錯了嗎?

+1

var是你的朋友:)而且你也不必在那裏放置斷點來知道類型。只需將鼠標懸停在var上,它就會顯示類型。 – Beku

+0

@Beku,它會告訴聲明的類型,而不是實例的實際類型; ConnectStream不是公共類,所以在這種情況下,它只會顯示爲Stream(聲明的返回類型的GetRequestStream) –

+0

@ThomasLevesque但是流足以去除var,這對代碼讀者造成了麻煩。 – Beku

回答

9

ConnectStream是一個內部類,你不能明確地使用它。但沒關係,因爲你不需要知道它的實際類型是ConnectStream:所有你需要知道的是它是一個Stream(由GetRequestStream聲明的返回類型),實際的實現並不重要。

如果要明確指定的類型,只是把它寫這樣的:

using (Stream postStream = request.GetRequestStream()) 
{ 
    postStream.Write(byteData, 0, byteData.Length); 
} 

(但它有完全相同的含義使用var

+5

+1「因爲你不需要知道它的實際類型是」 - 「所有你需要的要知道這是一個流。「 –

+1

@BobbyCannon我*希望* **希望**這是真的。不幸的是,System.Net.ConnectStream違反了Liskov替換原則,因此您不能將其視爲標準流。 –

+0

@JimmyHoffa,它如何違反LSP? –

1

不知道這個實際的API,GetRequestStream()外觀像工廠方法一樣,它最有可能返回ConnectStream的基類。

所以,你將不得不使用:

using (ConnectStream postStream = (ConnectStream) request.GetRequestStream()) { ... } 

請注意,你可以簡單地在編輯器中,將鼠標懸停postStream看到編譯時類型是什麼。

2

Theres是InfoQ網站上var關鍵字的一個很好的片段。這涉及何時何時不使用var。它不像'不使用它,除非你使用linq,它更多的是當你不需要引起注意的數據類型和使用類型的對象,當你需要引起注意的數據類型。

它是個人偏好的事情之一......但通常最好的選擇是你的老闆/代碼領導/架構師喜歡他們的代碼「語法」來使它變得統一。