方法返回作为参数传递的相同对象

本文关键字:对象 参数传递 返回 方法 | 更新日期: 2023-09-27 18:07:15

将对象传递给方法,然后返回相同的对象,而不是在方法本身内部创建一个新对象,这是可以接受的做法吗?

作为一个例子:如果有一个实体类,如下所示:

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;
}

方法返回作为参数传递的相同对象

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");

这对于构建器模式非常有用(当您想要一步一步地构建一个复杂的对象时)。

作为一个非常坏的例子:

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 };

这并没有什么可怕的错误,只是一些观察;

  • 你在一个叫做get的方法中设置细节,也许load更合适。
  • 如果你只传递UserDetails,因为你想要你的id,那么参数应该只是id而不是。
  • 在方法中修改参数对象通常被认为是不好的形式,即变异原则。

这样做是相当无意义的,因为您所做的赋值不会改变任何东西。

像这样调用它:

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();

这是一种可能的方法,当你只有一项工作时,也是最好的方法。您还可以考虑使用ref,它创建对传递的参数

的引用。
public void Get_Details(ref UserDetails user)
{
    // SQL Operations. . .
    user.age= 32;
}
通过这种方式,您不传递副本,而是引用传入的对象。但这可能变得相当模糊,在您的情况下是不必要的。

您可以在实体类的构造函数方法或其他方法中填充实体。它将在创建时准备好使用。

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
    }
}

您最好查阅一下Repository Pattern和OOD的概念。一般来说,我更喜欢投影或全加载实体。

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

注意:ref不是必需的,因为所有对象都是通过引用传递的。