方法返回作为参数传递的相同对象
本文关键字:对象 参数传递 返回 方法 | 更新日期: 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不是必需的,因为所有对象都是通过引用传递的。