繁体   English   中英

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

[英]method returning same object which was passed as parameter

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

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

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 这使界面具有凝聚力。
  • 在方法中修改参数对象通常被认为是不好的形式,即变异原理。

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

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

这样,您不会传递副本,而是引用您传入的对象。但这可能会变得非常模糊,在您的情况下是不必要的。 请参阅此处以获取洞察力。

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

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

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

这样做是没有意义的,因为你做的任务不会改变任何东西。

这样称呼它:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM