2013-04-03 4 views
5

Допустимо ли передавать объект в метод, а затем возвращать тот же объект, а не создавать новый объект внутри самого метода?метод, возвращающий тот же объект, который передан как параметр

В качестве примера: если есть класс сущностей следующим образом:

class UserDetails { 
    int UserID { get; set; } 
    string UserName { get; set; } 
    string UserAge { get; set; } 
} 

И затем я передать экземпляр этого класса к способу, а именно:

UserDetails UserInfo = new UserDetails(); 
UserInfo = Get_Details(UserInfo); 

Имеет ли смысл метод сделать следующее?

public UserDetails Get_Details(UserDetails user) { 
    // SQL Operations... 
    user.age = 32; 
    return user; 
} 
+3

Наблюдение, вы настраиваете детали вместо того, чтобы их :-p –

+2

одну маленькую вещь: ваше имя функции в заблуждение (я бы не предположить, что функция с именем 'Get_Details' меняет свой вклад). кроме того, что практика, которую вы изображаете, является правильной. – Oren

+1

Возможно, это должно быть на обмене стека кода обзора? – James

ответ

1

Это может быть полезно с builder pattern (если вы хотите, чтобы построить сложный шаг за шагом объект).

Как очень плохой пример:

class FooBuilder { 
    FooBuilder WithAge(int age); 
    FooBuilder WithUrl(Url url); 

    Foo ToFoo(); 
} 

new FooBuilder().WithAge(12).WithUrl(new Url("http://www.happybirthday.com/").ToFoo(); 

В вашем конкретном случае, я бы предпочел, чтобы инициализировать все на одном дыхании с синтаксисом инициализатора.

new User { Age = 45, UserName = "Bob", Id = 101 }; 
0

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

public void Get_Details(ref UserDetails user) 
{ 
    // SQL Operations. . . 
    user.age= 32; 
} 

этот путь, вы не передаете копию, но ссылки на объект, который вы передаёте. Но это может стать весьма неясными и ненужным в вашем случае. См. here для понимания.

+1

Вы бы использовали ключевое слово 'ref', если хотите изменить фактическую ссылку. Передача без ключевого слова 'ref' не создает копию объекта, она создает только копию ссылки. – Guffa

+0

Это не имеет смысла ... Почему там 'ref' то? –

+0

Ключевое слово 'ref' создает ссылку на переменную, содержащую ссылку (или переменную, содержащую значение, если это тип значения). Вы можете изменить переменную, которая передается внутри метода. – Guffa

0

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

public UserDetailsProjection GetDetailsByUserId(Guid userID) 
{ 
    // Code goes here 
    return user; 
} 

Примечание: ref не требуется, поскольку все объекты передаются по ссылке.

2

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

С другой стороны, что может быть полезно в некоторых ситуациях является беглым-интерфейсом, где экземпляр-метода класса вернуть экземпляр снова, например:

class X 
{ 
    public X DoThis(int number) 
    { 
    // do something 
    return this; 
    } 
    public X DoThat(string name) 
    { 
    // do something else 
    return this; 
    } 
} 

Это позволяет писать очень читаемый код , такие как:

var x = new X().DoThis(23).DoThat("asdf"); 
0

Выполнение этого как будто совершенно бессмысленно, поскольку задание, которое вы выполняете, ничего не меняет.

Назвать это так:

UserInfo = Get_Details(UserInfo); 

дает тот же результат, называя это и не обращая внимания на возвращаемое значение:

Get_Details(UserInfo); 

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

Было бы больше смысла, чтобы этот метод в классе, так что вы называете его как:

UserInfo.Get_Details(); 

Если ваш метод должен инициализировать объект, вы предпочли бы поместить код это конструктор чем назвав его после создания экземпляра:

class UserDetails { 

    int UserID { get; set; } 
    string UserName { get; set; } 
    string UserAge { get; set; } 

    public UserDetails() { 
    Get_Details(this); 
    } 

} 

Тогда вы просто создать экземпляр, а конструктор загружает данные:

UserDetails UserInfo = new UserDetails(); 
1

В этом нет ничего ужасного, кроме нескольких наблюдений;

  • Вы настраиваете детали внутри метода называется get возможно load является более целесообразным.
  • Если вы только проходите мимо UserDetails, потому что вам нужен идентификатор для вашего, тогда параметр должен быть только id. Это связывает интерфейс.
  • Обычно считается неправильной формой для изменения объекта параметра в рамках метода, то есть принципа мутации.
0

Вы можете заполнить свою сущность в методе конструктора или другом методе внутри класса сущности. Он будет готов к использованию при создании.

public class SomeClass 
{ 
    public string Field_1; 
    public int Field_2; 

    public SomeClass(int ID) 
    { 
     // Sql operations by ID or another value 
     // set fields 
    } 

    public AnotherMethod(int ID) 
    { 
     // Sql operations by ID or another value 
     // set fields 
    } 
} 
Смежные вопросы