Общее краткое руководство для передачи параметров метода по ссылке или по значению (C #)? - PullRequest
6 голосов
/ 22 мая 2009

Что-то вроде:

  • если должно быть возвращено значение переменной после вызова метода:
  • if можно создать до вызова метода, используйте ref
  • , если не требуется создавать экземпляр перед вызовом, используйте

  • если значение переменной используется для возврата, выбора или вычисления других значений из вызова метода, не используйте ref или out

Я правильно понял? Каков ваш краткий ориентир?

Ответы [ 3 ]

4 голосов
/ 22 мая 2009

Для типов значений:

  • Если вы просто хотите использовать содержащееся значение И НЕ изменять его в исходном месте, используйте метод передачи по умолчанию (по значению)
  • Если вам нужно изменить его в оригинальном магазине, используйте ref. Пример:

    int a = -3;
    
    protected void EnsurePositiveValues(ref int value)
    {
        if (value < 0)
            value = 0;
    }
    

Для справочных типов:

  • Если вам нужно просто использовать экземпляр или изменить его, используйте метод передачи по умолчанию (по ссылке; должен называться «по ссылке»)
  • Если вам нужно (пере) назначить исходную ссылку, используйте ref. Пример:

    User u = MembershipAPI.GetUser(312354);
    
    protected void EnsureUser(ref User user)
    {
        if (user == null)
            user = new User();
    }
    
1 голос
/ 22 мая 2009

Вам также необходимо учитывать значение и ссылочные типы. При передаче ссылочного типа методу в качестве параметра вы передаете указатель в переменную. Это означает, что внутри метода вы можете вносить изменения в переменную, и они будут доступны для кода, вызвавшего метод, однако, если вы установите для него значение null, вы только установите указатель на null, и переменная останется без изменений, когда метод возвращает.

0 голосов
/ 22 мая 2009

Не уверен, что это действительно ответ на ваш вопрос, но я нашел один хороший способ передать значение по ссылке (используя ключевое слово out) ...

int i = 0;

if (int.TryParse("StringRepresentation", out i)
{
    // do something with i which has taken the value of a the previous successful TryParse
}
...