簡體   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