Ref против No Ref для самоизменяющихся объектов - PullRequest
1 голос
/ 25 октября 2011

Если объект, на который ссылаются как на параметр, изменяется в функции, имеет ли значение, используете ли вы ref или нет?Есть ли разница между следующими двумя функциями?

void DisposeObject(ClassThing c)
{
   c.Dispose();
}

void DisposeObject(ref ClassThing c)
{
   c.Dispose();
}

Ответы [ 3 ]

6 голосов
/ 25 октября 2011

Это не имеет значения.Важно то, что вы назначаете что-то для c (и хотите, чтобы это отражалось вне метода):

c = new ClassThing();

В этом случае вы бы использовали ref.

1 голос
/ 25 октября 2011

Это не зависит от вашего случая.

НО:

если вы передаете ссылочный объект с ключевым словом ref, имеющимся внутри метода, возможность изменитьссылка, указывающая на другой объект этого типа (поэтому он будет виден вне метода)

0 голосов
/ 25 октября 2011

Согласно в руководстве MSDN по передаче параметров ссылочного типа :

Когда вы передаете параметр ссылочного типа по значению, можно изменить данные, указанные напо ссылке, такой как значение члена класса.Однако вы не можете изменить значение самой ссылки;то есть вы не можете использовать одну и ту же ссылку для выделения памяти для нового класса и сохранения ее вне блока.Для этого передайте параметр, используя ключевое слово ref или out.

Таким образом, вы можете изменить исходный объект, но вы не можете изменить исходный объект для ссылки на другое место в памяти.Пример:

static void Main()
{
    int[] integerArray = new int[8];
    foo(integerArray);
}

private void foo(int[] myArray)
{
    myArray[0] = 5;  //this changes integerArray
    myArray = new int[4]; //this does not change integerArray,
                          // ... but it would if you used ref or out
}

Так что разница имеет значение, хотя я не знаю конкретно о поведении Dispose().

...