Думайте о out
как о способе заставить параметр работать как возвращаемое значение.
Итак, они очень похожи:
void Foo(out int result)
{
result = 5;
}
int Foo()
{
return 5;
}
А затем подумайте о ref
как о способе разрешения параметру быть и входом, и выходом.
Итак, в вашем примере, если вы объявили свой метод:
public void AddToList(ref SomeClass Item)
Тогда вызывающий абонент должен написать что-то вроде:
SomeClass i = null;
obj.AddToList(ref i);
Это было бы незаконно, например:
obj.AddToList(ref new SomeClass());
Они будут вынуждены передавать имя переменной, а не выражение, чтобы метод AddToList
мог сохранить значение в переменной. Добавляя префикс ref
, вы разрешаете своему методу указывать переданную переменную на другом объекте.