9

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

例如:如果有一个实体类如下:

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

7 回答 7

3

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

另一方面,在某些情况下有用的是流式接口,其中类的实例方法再次返回实例,例如:

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");
于 2013-04-03T07:54:31.507 回答
1

这对于构建器模式很有用(当您想逐步构建复杂的对象时)。

作为一个非常糟糕的例子:

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 };
于 2013-04-03T07:51:17.017 回答
1

除了一些观察之外,这并没有什么可怕的错误;

  • 您在一个名为的方法中设置细节get可能load更合适。
  • 如果你只是UserDetails因为你想要你的 id 而传入,那么参数应该只是id。这样可以保持界面的凝聚力。
  • 在方法中修改参数对象通常被认为是不好的形式,即变异原则。
于 2013-04-03T07:56:12.273 回答
0

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

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

这样,您不会传递副本,而是引用您传入的对象。但这可能会变得非常晦涩,并且在您的情况下是不必要的。请参阅此处以获取见解。

于 2013-04-03T07:52:05.473 回答
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
    }
}
于 2013-04-04T12:42:28.530 回答
0

您最好查看存储库模式和 OOD 的概念。一般来说,我更喜欢投影或满载实体。

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

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

于 2013-04-03T07:53:48.527 回答
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();
于 2013-04-03T07:55:30.287 回答