我如何使用System.Net.ConnectStream?

时间:2012-01-19 16:35:34

标签: c# correctness

我试图了解我的一些前任代码,他们帮助我们使用'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时)。我错了吗?

4 个答案:

答案 0 :(得分:9)

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

如果要明确指定类型,只需按以下方式编写:

GetRequestStream

(但它与使用using (Stream postStream = request.GetRequestStream()) { postStream.Write(byteData, 0, byteData.Length); }

具有完全相同的含义

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

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

所以你必须使用:

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

请注意,您只需将鼠标悬停在编辑器中的postStream上即可查看编译时类型。

答案 3 :(得分:0)

我从这里重复了一个答案: How do I get the filesize from the Microsoft.SharePoint.Client.File object?

它'来自Freejete'的回复和他的方法' ReadToEnd'对我来说就像是一种魅力。