2013-04-03 91 views
5

將對象傳遞給方法,然後返回相同對象而不是在方法本身內創建新對象是否可接受?返回作爲參數傳遞的相同對象的方法

舉個例子:如果有一個實體類如下:

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

的觀察,你設置的細節,而不是讓他們:-P –

+2

一個小東西:你的函數名是誤導(我不會猜測命名函數'Get_Details'改變其輸入)。除此之外,你的練習是正確的。 – Oren

+1

也許這應該是在代碼審查棧交換? – James

回答

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

這是一種可能的方法,當您只有一個項目工作時,最好。你也可以考慮使用ref,它創建於傳遞的參數

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

這樣一個參考,你不通過副本,而是引用您傳入的對象。但是,這會變得非常模糊,是你的情況不必要。有關見解,請參見here

+1

如果要更改實際參考,則只能使用'ref'關鍵字。沒有'ref'關鍵字傳遞它不會創建對象的副本,它只會創建引用的副本。 – Guffa

+0

這沒有任何意義......爲什麼有'ref'呢? –

+0

'ref'關鍵字爲保存引用的變量創建一個引用(或者如果它是一個值類型,則保存值的變量)。您可以更改從方法內傳入的變量。 – Guffa

0

您可能會很好地查找Repository Pattern和OOD的概念。一般來說,我更喜歡投影或完全加載的實體。

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

注:ref不是必需的,因爲所有對象都是通過引用傳遞的。

2

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

沒有什麼可怕的錯誤這一點,但一對夫婦的意見;

  • 要設置方法的細節裏面叫get也許load是比較合適的。
  • 如果你只在UserDetails路過,因爲你要爲你的則該參數標識應該只是id代替。這保持了界面的凝聚力。
  • 一般認爲不好的形式的方法,即,突變原則之內,修改參數對象。
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 
    } 
} 
相關問題