Должен ли я использовать ключевое слово ref или out здесь? - PullRequest
4 голосов
/ 31 марта 2010

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

Итак, мой код выглядит так:

User user = null;  // may or may not be null at this point.

SetUserProperties(user);

UpdateUser(user);


public void SetUserProperties(User user)
{
      if(user == null) 
          user = new User();

     user.Firstname = "blah";
     ....

}

Итак, я обновляю тот же объект, который я передаю в SetUserProperties.

Должен ли я использовать ключевое слово ref в моем методе SetUserProperties?

Ответы [ 5 ]

5 голосов
/ 31 марта 2010

Важно знать о разнице между объектом и переменной :

  • Вы хотите, чтобы переменная вызывающей стороны обновлялась для ссылки на новый объект в некоторых случаях, поэтому вам нужно передать по ссылке семантику. Это означает, что вам нужно ref или out
  • Вам нужно прочитать существующее значение переменной, чтобы узнать, создавать ли новый объект или нет. Это означает, что вам нужно ref, а не out. Если вы измените его на параметр out, ваш оператор if не скомпилируется, потому что user не будет определенно назначен в начале метода.

Лично я не уверен, что это хороший дизайн, однако. Вы уверены , что для метода имеет смысл создать новый объект? Разве вы не можете сделать это на сайте вызова? Это немного неловко, как есть.

Другая альтернатива использованию ref (но все еще потенциально создающая нового пользователя в методе) будет возвращать соответствующую ссылку:

user = SetUserProperties(user);

...

public User SetUserProperties(User user)
{
    if(user == null) 
    {
        user = new User();
    }
    user.Firstname = "blah";
    ....
    return user;
}
5 голосов
/ 31 марта 2010

Я думаю, что 'ref' соответствует семантике того, что вы пытаетесь сделать здесь лучше.

Однако я стараюсь избегать ключевых слов «out» и «ref», если это возможно.

Это соответствует вашим потребностям? Он также не использует и немного более понятен в том, что он делает, IMO.

user = user ?? new User();

SetUserProperties(user);

UpdateUser(user);
0 голосов
/ 31 марта 2010

ref = Вы хотите, чтобы у функции был дескриптор объекта, и потенциально «перенаправляет ее в другое место в памяти» (т. Е. Устанавливает для другого экземпляра этого типа объекта)

out = Вам требуется метод для "перенаправления его в другое место в памяти"

0 голосов
/ 31 марта 2010

Вы бы использовали ref, поскольку у вас есть потенциал , чтобы указать переменную на новый объект в памяти. Если бы вы использовали, вам бы потребовалось , чтобы сменить пользователя.

0 голосов
/ 31 марта 2010

Да, вы должны использовать ref. Ключевое слово out предназначено для неинициализированных переменных, что здесь не так.

...