Об'єкти взагалі не передаються. За замовчуванням аргумент оцінюється і його значення передається за значенням як початкове значення параметра методу, який ви викликаєте. Тепер важливим моментом є те, що значення є посиланням на еталонні типи - спосіб потрапляння на об’єкт (або нуль). Зміни в цьому об’єкті будуть видні у абонента. Однак зміна значення параметра для посилання на інший об'єкт не буде видно, коли ви використовуєте значення pass by, що є типовим для всіх типів.
Якщо ви хочете використовувати пропускний посилання, ви повинні використовувати 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(...);
}
У мене є стаття, яка детальніше описується в цьому . По суті, "пройти посилання" не означає, що ви думаєте, що це означає.