Вы должны быть очень ясно о различии между ссылочными типами и типами значений и параметрами "по значению" и "ссылочными" параметрами.
У меня есть статьи на обе темы:
При взаимодействии несколько взаимодействуютпараметр «по значению», который является ссылочным типом: в этом случае значение, которое копируется по значению, является самой ссылкой;вы все еще можете изменить объект, на который ссылается ссылка:
void SomeMethod(StringBuilder x)
{
x.Append("Modified");
}
...
StringBuilder builder = new StringBuilder();
SomeMethod(builder);
Console.WriteLine(builder.ToString()); // Writes "Modified"
Обратите внимание, что это не то же самое, что семантика передачи по ссылке ... if SomeMethod
были изменены, чтобы включить:
x = null;
, тогда не сделает переменную builder
нулевой.Однако, если вы также изменили параметр x
на ref StringBuilder x
(и изменили код вызова соответствующим образом), то любые изменения на x
(например, установив его на ноль) будут будет замечено вызывающим абонентом.
При разработке собственного API я настоятельно рекомендую вам почти использовать ref
или out
параметры.Они могут быть полезными время от времени, но обычно они указывают на то, что вы пытаетесь вернуть несколько значений из одного метода, что часто лучше сделать с типом, специально инкапсулирующим эти значения, или, возможно, Tuple
введите, если вы используете .NET 4. Конечно, есть исключения из этого правила, но это хорошая отправная точка.