2012-01-19 13 views
1

私は、親切にも、すべてを宣言するために 'var'を使用していた私の前任者コードの周りに頭を抱えようとしています。私は以下の通りですステートメントを使用しているSystem.Net.ConnectStreamを使用するにはどうすればいいですか?

:私はここにブレークポイントを置くとき

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

、postStreamはSystem.Net.ConnectStreamとして自動車のウィンドウに表示されます。 'var'の代わりに 'ConnectStream'を使用したいが、コンパイラはこれを気に入らない。

私は何をしないのです、なぜ私はこのように私のコードを書くことはできません。

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

私は、これは簡単です知っているが、あなたがに特別な理由がない限り、私はいつも「VAR」を使用しないように教えられましたそうする(LINQを扱うときなど)。私が間違っている?

+1

varはあなたの友人です:)また、タイプを知るためにそこにブレークポイントを置く必要はありません。 varの上にマウスを置くだけで、タイプを伝えることができます。 – Beku

+0

@ Beekでは、インスタンスの実際の型ではなく、宣言された型を通知します。 ConnectStreamはパブリッククラスではないため、この場合はStream(GetRequestStreamの宣言された戻り型)として表示されます。 –

+0

@ThomasLevesqueしかし、ストリームを削除するだけでコードの読者に問題が発生しています。 – Beku

答えて

9

ConnectStreamは内部クラスであり、明示的に使用することはできません。実際のタイプがConnectStreamであることを知る必要がないため、重要ではありません。Stream(戻り値のタイプはGetRequestStreamと宣言されています)ということだけ知っておく必要があります。実際の実装は実際問題ではありません。

明示的に型を指定したい場合は、ちょうどこのようにそれを書く:

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

(それはvar使用とまったく同じ意味を持っている)、この実際のAPIを知らなくてもGetRequestStream()ルックスを

+5

+1 "あなたはそれが実際のタイプであることを知る必要がないのでそれがストリームであることを知るために」 –

+1

@BobbyCannon I * wish * ** wish **これは本当だった。残念ながら、System.Net.ConnectStreamはLiskov Substitution Principleに違反しているため、標準ストリームのように扱うことはできません。 –

+0

@JimmyHoffa、それはどのようにLSPに違反しますか? –

1

をファクトリメソッドのように、ConnectStreamの基本クラスを返す可能性が最も高いです。

だから、使用する必要があります:あなたは、単にコンパイル時の型が何であるかを確認するために、エディタでpostStream上にマウスを置くことができ

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

注意を。

2

InfoQサイトのvarキーワードの大きなスニペットです。これは、いつ、いつvarを使わないかについて話します。あなたのデータ型に注意を払う必要がなく、データ型に注意を払う必要があるときに型付きオブジェクトを使用する必要がないときには、linqを使用するより多く使用しなければ。

これは個人的なものですが、通常、あなたの上司/コードリーダー/アーキテクトはコードを「文法」で統一するのが好きです。

関連する問題