Передача по ссылке vs Возвращение экземпляра класса - PullRequest
1 голос
/ 11 декабря 2011

Согласно заголовку, есть ли разница при передаче ссылочного типа в метод, такой как:

public void GetStream(Stream outputStream)
{
   outputStream.Write(data);
}

VS

public Stream GetStream()
{
   MemoryStream ms = new MemoryStream();
   ms.Write(data);
   return ms; 
}

Я заметил, что много Java-кода передает класс по ссылке (не уверен в точных причинах этого). Однако в .NET это просто вопрос предпочтений?

Когда бы вы выбрали один из других?

Ответы [ 2 ]

2 голосов
/ 11 декабря 2011

Два очень разные.В первом примере вызывающий абонент отвечает за создание потока (любого типа, который он предпочитает) и может передать поток, который уже расположен в некоторой произвольной позиции.

Во втором вызываемый объект определилтип потока и всегда записывает в позиции 0.


Если бы ваш первый пример был таким:

public void GetStream(out stream outputStream)
{
   outputStream = new MemoryStream();
   outputStream.Write(data);
}

, они были бы по крайней мере ближе к сопоставимым.

Здесь основное отличие состоит в том, что вызывающий имеет для того, чтобы иметь объявленную переменную для захвата outputStream, тогда как в другом случае вызывающий может игнорировать возвращаемое значение потока.

Тем не менее, вторая из (возвращающая значение) встречается чаще - если у метода есть одно возвращаемое значение, гораздо предпочтительнее, чтобы это значение было , возвращаемым методомвместо метода void с параметром out - в большинстве случаев в .NET параметры out следует использовать экономно (и только если возвращаемое значение из метода уже равно сомчто-нибудь полезное).Примером такого метода могут быть методы TryParse для различных типов, которые возвращают bool (указывает на успех), и проанализированное значение передается обратно как параметр out.

1 голос
/ 11 декабря 2011

Во-первых, концепция «разделения интересов» предполагает, что метод с именем «GetStream» не должен также записывать в поток.Особенно, когда «байты» не являются входящим аргументом.На самом деле это две отдельные функции, и их следует кодировать таким образом.

Но для первоначального вопроса передача по ссылке просто означает, что метод имеет возможность изменить экземпляр объекта.Использование возвращаемого значения для возврата новой или существующей ссылки является шагом к написанию неизменяемых объектов и определенно стоит рассмотреть в качестве реализации.

...