Как я могу использовать 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). Я ошибся?

4 ответа

Решение

ConnectStream это внутренний класс, вы не можете использовать его явно. Но это не имеет значения, потому что вам не нужно знать, что его фактический тип ConnectStream: все, что вам нужно знать, это то, что это Stream (возвращаемый тип, объявленный GetRequestStream), фактическая реализация на самом деле не имеет значения.

Если вы хотите явно указать тип, просто напишите его так:

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

(но оно имеет то же значение, что и использование var)

Theres отличный фрагмент от ключевого слова var на сайте InfoQ. Это говорит о том, когда и когда не следует использовать вар. Это не так ясно, как не использовать его, если вы не используете linq, тем более вы используете его, когда вам не нужно привлекать внимание к типу данных и использовать типизированные объекты, когда вам нужно привлечь внимание к типу данных,

Это одно из личных предпочтений... но, как правило, лучшим предпочтением является то, что вашему боссу / руководителю кода / архитектору нравится, когда их кодовая "грамматика" выглядит так, чтобы она была однородной.

Не зная этого фактического API, GetRequestStream() выглядит как фабричный метод, он, скорее всего, возвращает базовый класс ConnectStream.

Таким образом, вы должны использовать:

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

Обратите внимание, что вы можете просто навести курсор мыши postStream в редакторе, чтобы увидеть, что тип компиляции.

Отсюда я повторно использовал один ответ: Как получить размер файла из объекта Microsoft.SharePoint.Client.File?

Это 'ответ от'Freejete'и его метод'ReadToEnd'сработал для меня как обаяние.

Другие вопросы по тегам