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

时间:2013-04-03 07:47:30

标签: c# oop methods

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

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

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

7 个答案:

答案 0 :(得分:3)

IMO,无需返回对象。由于传递到方法引用,因此调用者已经拥有对同一对象的引用(在方法完成后使用更新的值)。

另一方面,在某些情况下有用的是fluent-interface,其中类的instance-methods再次返回实例,例如:

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

答案 1 :(得分: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 };

答案 2 :(得分:1)

这没有什么可怕的错误,但有几点意见;

  • 您正在设置名为get的方法中的详细信息,或许load更合适。
  • 如果您只是传递UserDetails,因为您想要身份证明,那么参数应该只是id。这使界面具有凝聚力。
  • 在方法中修改参数对象通常被认为是不好的形式,即变异原则。

答案 3 :(得分:0)

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

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

这样,你不会传递副本,而是引用你传入的对象。但是这可能会变得非常模糊,在你的情况下是不必要的。有关见解,请参阅here

答案 4 :(得分:0)

您可能会查找存储库模式和OOD的概念。一般来说,我更喜欢投影或完全加载的实体。

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

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

答案 5 :(得分: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();

答案 6 :(得分: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
    }
}