2016-08-04 43 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

相关问题