Объекты вообще не передаются.По умолчанию аргумент оценивается, и его значение передается по значению в качестве начального значения параметра вызываемого вами метода.Теперь важным моментом является то, что значение является ссылкой для ссылочных типов - способ добраться до объекта (или ноль).Изменения в этом объекте будут видны из звонящего.Однако изменение значения параметра для ссылки на другой объект будет не видимым при использовании передачи по значению, которая используется по умолчанию для всех типов.
Если вы хотите использовать передачу по ссылке, вы должны использовать out
или ref
, независимо от того, является ли тип параметра типом значения или ссылочным типом.В этом случае, по сути, сама переменная передается по ссылке, поэтому параметр использует то же место хранения, что и аргумент, и вызывающий видит изменения в самом параметре.
Итак:
public void Foo(Image image)
{
// This change won't be seen by the caller: it's changing the value
// of the parameter.
image = Image.FromStream(...);
}
public void Foo(ref Image image)
{
// This change *will* be seen by the caller: it's changing the value
// of the parameter, but we're using pass by reference
image = Image.FromStream(...);
}
public void Foo(Image image)
{
// This change *will* be seen by the caller: it's changing the data
// within the object that the parameter value refers to.
image.RotateFlip(...);
}
У меня есть статья , которая более подробно описана в этом .По сути, «передача по ссылке» не означает, что вы думаете, что это означает.