2016-08-04 69 views
0

對於下面的索引器,它應該是這樣的:{}用戶可以傳遞employeeid或firstname,set {}只能傳遞employeeid。我們可以限制索引器中索引器的數目嗎?

下面是代碼:

public Employee this[int employeeid = 0,string firstname = ""] 
{ 
    get 
    { 
     if (employeeid != 0) 
     { 
      return Employees.FirstOrDefault(emp => emp.No == employeeid); 
     } 
     else 
     { 
      return Employees.FirstOrDefault(emp => emp.FirstName == firstname); 
     } 
    } 
    set 
    { 
     if (employeeid == value.No) 
     { 
      Employees.FirstOrDefault(emp => emp.No == employeeid).FirstName = value.FirstName; 
      Employees.FirstOrDefault(emp => emp.No == employeeid).LastName = value.LastName; 
     } 
     else 
     { 
      ArgumentException argEx = new ArgumentException("Falied to update"); 
      System.Windows.Forms.MessageBox.Show(argEx.Message); 
     } 
    } 
} 

我只是想知道有沒有這將限制在設定的操作通過索引的數量和類型,任何語法。 或者乾脆添加一個新的索引器,該集合顯然起作用。

回答

3

添加新的索引器。 C#增加了索引器來提供一個類似數組的語法和用戶定義的語義。你的代碼提供的語義是違反直覺的,而不是所有類似數組的。

例如,employee[123, "Alex"]employee[123, "Bart"]將返回相同的Employee,因爲如果ID和名稱都存在,ID會獲勝。這將是一個正確命名的方法做了一個OK的事情,例如

Employee GetEmployeeByIdOrName(int employeeid = 0,string firstname = "") { 
    ... 
} 

多參數索引有望治療參數的整個組合爲一個鍵,你的實現沒有做。

例如,如果一個功能有兩個參數intstring。那麼如果用戶可以給intstring但不是兩者。你不覺得我們需要一個新的函數語法來使這成爲可能。

今天你就可以用一對重載調用同一方法做到這一點:

// The following two methods are visible to users of your object 
public Employee GetEmployee(int id) { 
    return GetEmployeeByIdOrName(id, null); 
} 
public Employee GetEmployee(string name) { 
    return GetEmployeeByIdOrName(0, name); 
} 
// This private method provides an implementation 
private Employee GetEmployeeByIdOrName(int employeeid, string firstname) { 
    ... 
} 
+3

下一篇「只是因爲你可以,並不意味着你應該」 – Jamiec

+0

OK參數是常見的set和get。只有可選參數的功能而不限制參數。例如,如果一個函數有兩個參數int和string。然後,如果用戶可以給int或字符串,但不是兩者。你不覺得我們需要一個新的函數語法來使這成爲可能。索引器和函數是不同的,但關於參數部分相似。所以我提出這個問題。 –

+1

@NithinB你需要使用方法重載,這是方便你的情況下可選參數。 – user3185569

2

你不能在同一個索引使用setter和getter不同的參數。

爲了誠實,我明白你對你的班級開發人員完全不清楚你想做什麼。

我不會使用索引器通過id或名稱在同一個方法中找到類內數組中的對象。

爲什麼你不拆不是進入兩種方法(索引)爲每個搜索條件:

public Employee this[int employeeid] 
{ 
    get 
    { 
     return Employees.FirstOrDefault(emp => emp.No == employeeid); 
    } 
} 

public Employee this[string firstname] 
{ 
    get 
    { 
     return Employees.FirstOrDefault(emp => emp.FirstName == firstname); 
    } 
} 

Set索引是完全不清楚和誤導。您檢查傳入的對象是否具有與您調用索引器方法的對象相同的ID,然後從傳入的對象中更新該值。更何況你只更新該對象中的兩個屬性。這是一個糟糕的設計,而另一種明確的解決辦法是:

public void UpdateEmployee(Employee updatedEmployee) 
{ 
    if (this.No == updatedEmployee?.No) 
    { 
     this.FirstName = updatedEmployee.FirstName; 
     this.LastName = updatedEmployee.LastName; 
    } 
    else 
    { 
     // throw 
    } 
} 
+0

是的我知道有很多的可能性來實現像添加新的索引器或函數。但我們不能聲明索引器像公共字符串this [(set)(get)int x,(get)String y]。這意味着get {}可以被這兩個參數調用,並且僅由第一個參數設置{}。我認爲這種語法會使編碼更小,更靈活。 –

+0

@NithinB不,你不能。這是在回答中說明的,你不能將吸氣劑的參數與吸氣劑的參數分開。 – user3185569

+0

@NithinB另外,分離索引器使得它清楚明確你的意圖是什麼。無論如何,哪個更好。你應該總是選擇比花哨的東西更清晰。 – user3185569

相關問題