我如何使用System.Net.ConnectStream?

我试图了解一些前任代码,他们帮助我们使用’var’来声明一切。

我有一个使用声明如下:

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

当我在这里放置断点时,postStream在Autos窗口中显示为System.Net.ConnectStream。 而不是’var’我想使用’ConnectStream’,但编译器不喜欢这个。

我错过了什么,为什么我不能这样写我的代码:

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

我知道这是微不足道的,但我总是被教导不要使用’var’,除非你有特定的理由这样做(例如处理LINQ时)。 我错了吗?

ConnectStream是一个内部类,您不能显式使用它。 但这没关系,因为你不需要知道它的实际类型是ConnectStream :你需要知道的是它是一个Stream (由GetRequestStream声明的返回类型),实际的实现并不重要。

如果要明确指定类型,只需像这样写:

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

(但它与使用var具有完全相同的含义)

这是InfoQ网站上var关键字的一个很棒的片段。 这谈到何时何时不使用var。 除非你使用linq,否则它不是那么明确,除非你使用linq,当你不需要引起对数据类型的注意并使用类型对象时需要引起对数据类型的注意。

它是个人偏好的东西之一…但通常最好的偏好是你的老板/代码主管/建筑师喜欢他们的代码’语法’,以使其统一。

在不知道这个实际API的情况下, GetRequestStream()看起来像一个工厂方法,它很可能返回一个基类ConnectStream。

所以你必须使用:

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

请注意,您可以将鼠标hover在编辑器中的postStream上,以查看编译时类型。

我从这里重用了一个答案: 如何从Microsoft.SharePoint.Client.File对象获取文件大小?

这是’Freejete’的回复,他的方法’ReadToEnd’对我来说就像一个魅力。