Я знаю, что это старый вопрос, но ни один из ответов не дает четкой прямой причины, по моему мнению.
Вам не нужно использовать ref
в этом случае, и вот почему. Рассмотрим эту функцию:
void Foo(MyClass a1, ref MyClass a2, out MyClass b1, int c1, MyStruct d1, ref MyStruct d2)
{
}
Теперь вызовите эту функцию как
MyClass a = new MyClass();
MyClass b = null
int c = 3;
MyStruct d = new MyStruct();
Foo(a, ref a, b, c, d, ref d);
Вот что вы получаете внутри функции:
void Foo(MyClass a1, ref MyClass a2,
out MyClass b1,
int c1,
MyStruct d1, ref MyStruct d2)
{
a1 is a copy in memory of the pointer to the instantiated class a;
a2 is the pointer to the instantiated class a;
b1 is the pointer to b, but has the additional check of having to be set within this function - and cannot be used before being set;
c1 is a copy in memory of the variable c;
d1 is a copy in memory of the struct d;
d2 is the struct d;
}
Важные вещи для реализации:
- настройка
a1
на null
будет не установить a
на null
.
- настройка
a2
на null
установит a
на null
.
- требуется установка
b1
.
- настройка
c1
будет не изменить c
.
- настройка
d1
будет не изменить d
.
- значение
d2
изменится d
.
Это допускает некоторые странности, подобные этой:
void Foo(MyClass x, ref MyClass y)
{
x = null;
y.Bar("hi");
}
Называется как:
MyClass a = new MyClass();
Foo(a, ref a);
Вы используете класс, и поэтому ваша ситуация больше похожа на переменную a1
в вызове функции. Что означает ref
строго не требуется.
Статья Джона Скита не сильно вам поможет, потому что его пример с IntHolder
- это struct
, а не class
. Struct
является типом значения, подобным int
, и должен обрабатываться так же.