2012-01-17 33 views
0

我知道了「合理的方法」這個問題......我應該傳遞整個對象實例還是僅傳遞方法所需的值?

這是邏輯上是正確

public static Department FindDepartment(Employee emp) 
{ 
    if(emp.ID > 500) 
    { 
     return new Department("Department for Over 500"); 
    }else{ 
     return new Department("Department for 500 and under"); 
    } 
} 

...因爲部門其實是建立關閉員工,而以下是邏輯上不正確

public static int GetPlusOne(Employee emp) 
{ 
    return emp.ID + 1; 
} 

...因爲方法還真不是僱員的功能......它只是一個整數米odifier。

這一切都表示(並隨時指出,如果我的錯誤我就因爲某些原因),是否有合格員工的整個實例時,會丟失任何性能?

我有一個將被調用的大部分時間從不同的類內的基本方法,所以我想在這裏權衡性能與邏輯。但如果沒有什麼可以擔心表現明智的話,那麼選擇就變得合乎邏輯了(哈哈......小pun)。

+2

爲什麼不把它定義爲擴展方法? – 2012-01-17 16:06:19

+3

一個很好的經驗法則是不會擔心性能,直到它成爲一個問題。當發生這種情況時,請使用分析來查看瓶頸的位置 - 它們幾乎總是不在您期望的位置! – vaughandroid 2012-01-17 16:10:44

回答

2

IF Employeeclass然後.NET傳遞一個引用(它基本上是一個指針),而不是實例本身......所以性能與實際實例方法(它也接收對實例的引用一個隱含參數稱爲this)。

,你甚至可以將它們定義爲Extension Methods像:

public static Department FindDepartment(this Employee emp) 
{ 
    if(emp.ID > 500) 
    { 
     return new Department("Department for Over 500"); 
    }else{ 
     return new Department("Department for 500 and under"); 
    } 
} 

然後調用它像任何實例方法上的Employee一個實例:

Employee emp = ...; 

Department dep = emp.FindDepartment(); 
+0

感謝提醒他們作爲指針傳遞。我確信在一些編程課上我學會了這一點,但卻忘記了這一點。沒有使用擴展方法...看起來很有趣,可能會玩弄它們,看看它們是否適合我的場景。 – cavillac 2012-01-17 17:58:27

3

在方法方面調用本身,任何性能損失將不足以說明問題。更重要的是這會影響程序的可維護性。

如果您以Employee作爲參數,則必須始終確保其具有en Employee,然後才能調用您的方法。在一方面,這有助於避免犯錯,人們傳遞了錯誤的int可變進你的方法:

int plusOne = GetPlusOne(emp.DirectReportId); // oops, didn't you mean EmployeeId? 

在另一方面,它可以是惱人,如果我只有員工的ID,現在我有做某種類型的數據庫訪問以產生實際的Employee對象。

foreach(var pinkSlip in pinkSlips) 
{ 
    var employee = GetEmployee(pinkSlip.EmployeeId); // ugh, is this really necessary? 
    int plusOne = GetPlusOne(employee); 
    ... 
} 

如果GetEmployee做一些昂貴的東西就像一個數據庫往返,上面的代碼可能會非常緩慢:不是因爲調用GetPlusOne的,而是因爲你不得不產生Employee時,所有你感興趣的是ID。

最終,你必須根據你希望如何被使用的問題的方法,這個決定。

+0

感謝您的回答......這非常有見地。 – cavillac 2012-01-17 17:55:58

0

我居然會一舉兩得,depFindBy(INT僱員)和depFindBy(員工員工)。沒有太多的工作,以後可以方便地使用這兩種方法。

相關問題