2010-03-31 2 views
4

У меня есть объект, который может быть null, который я передам методу, который установит его свойства.Должен ли я использовать ключевое слово ref или out здесь?

Так что мой код выглядит следующим образом:

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

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

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

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

user = user ?? new User(); 

SetUserProperties(user); 

UpdateUser(user); 
+0

Да, но свойства пользователя (которые были обновлены в SetUserProperties) будут вне сферы действия в UpdateUser (пользователь)? – Blankman

+0

@Blankman: Нет - потому что они будут на одном объекте. Значение 'user' является просто ссылкой. См. Http://pobox.com/~skeet/csharp/parameters.html –

-1

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

0

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

5

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

  • Вы хотите переменной вызывающего абонента будет обновляться, чтобы обратиться к новому объекту в некоторых случаях, так что вам нужно пройти по ссылке семантика. Это означает, что вам нужно 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; 
} 
+0

Мой метод на самом деле возвращает логическое уже, то есть проблема. – Blankman

+0

@Blankman: Вот почему лучше всего дать нам как можно более реалистичную картину в вопросе;) –

0

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

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

Смежные вопросы