C# 我们可以限制索引器中集合运算符的索引器数量吗?

C# 我们可以限制索引器中集合运算符的索引器数量吗?,c#,C#,对于下面的索引器,它应该是这样的:对于get{},用户可以传递employeeid或firstname;对于set{},用户只能传递employeeid 代码如下: public Employee this[int employeeid = 0,string firstname = ""] { get { if (employeeid != 0) { return Employees.FirstOrDefault(emp =

对于下面的索引器,它应该是这样的:对于get{},用户可以传递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);
        }
    }
}
我只是想知道是否有任何语法会限制set操作中传递的索引器的数量和类型。 或者简单地为显然有效的集合添加新索引器。

添加新索引器。C#添加了索引器,以提供具有用户定义语义的类似数组的语法。代码提供的语义是违反直觉的,根本不像数组

例如,
employee[123,“Alex”]
employee[123,“Bart”]
将返回相同的
employee
,因为ID和名称同时存在时ID获胜。例如,对于一个正确命名的方法来说,这样做是可以的

Employee GetEmployeeByIdOrName(int employeeid = 0,string firstname = "") {
    ...
}
多参数索引器应将参数的整个组合视为一个键,而您的实现不会这样做

例如,如果函数有两个参数
int
string
。然后,如果用户可以给出
int
string
,但不能同时给出两者。难道你不认为我们需要一种新的函数语法来实现这一点吗

现在,您可以通过一对重载调用相同的方法来实现这一点:

// 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) {
    ...
}
添加一个新的索引器。C#添加了索引器,以提供具有用户定义语义的类似数组的语法。代码提供的语义是违反直觉的,根本不像数组

例如,
employee[123,“Alex”]
employee[123,“Bart”]
将返回相同的
employee
,因为ID和名称同时存在时ID获胜。例如,对于一个正确命名的方法来说,这样做是可以的

Employee GetEmployeeByIdOrName(int employeeid = 0,string firstname = "") {
    ...
}
多参数索引器应将参数的整个组合视为一个键,而您的实现不会这样做

例如,如果函数有两个参数
int
string
。然后,如果用户可以给出
int
string
,但不能同时给出两者。难道你不认为我们需要一种新的函数语法来实现这一点吗

现在,您可以通过一对重载调用相同的方法来实现这一点:

// 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) {
    ...
}

不能在同一索引器中为setter和getter使用不同的参数

老实说,对于使用您的类的开发人员来说,我完全不清楚您试图做什么

我不会使用索引器在同一方法中按id或名称查找类中数组中的对象

为什么不针对每个搜索条件将than拆分为两个方法(索引器):

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);
    }
}
您的
集合
索引器完全不清楚且具有误导性。检查传递的对象是否与调用索引器方法的对象具有相同的ID,然后从传递的对象更新该值。更不用说,您只更新该对象中的两个属性。这是一个糟糕的设计,而另一个清晰的解决方案是:

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

不能在同一索引器中为setter和getter使用不同的参数

老实说,对于使用您的类的开发人员来说,我完全不清楚您试图做什么

我不会使用索引器在同一方法中按id或名称查找类中数组中的对象

为什么不针对每个搜索条件将than拆分为两个方法(索引器):

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);
    }
}
您的
集合
索引器完全不清楚且具有误导性。检查传递的对象是否与调用索引器方法的对象具有相同的ID,然后从传递的对象更新该值。更不用说,您只更新该对象中的两个属性。这是一个糟糕的设计,而另一个清晰的解决方案是:

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

在“仅仅因为你可以,并不意味着你应该”下填写“OK参数对于set和get来说很常见”。并且只有可选参数的功能,而不限制参数。例如,如果函数有两个参数int和string。然后,如果用户可以给出int或string,但不能同时给出两者。难道你不认为我们需要一种新的函数语法来实现这一点吗。索引器和函数不同,但参数部分相似。所以我提出了这个问题。@NithinB您需要使用方法重载,这对于可选参数的情况很方便。@NithinB我编辑了答案以回应您的评论,请看一看。我只需在函数Function1(int firstNumber=0,string secondNumber=null)的情况下编写此命令即可实现。但对用户传递的参数数量没有限制,例如可以传递第一个参数或第二个参数,但不能同时传递这两个参数。我想限制用户提供两个参数,比如编译时错误。在“仅仅因为你可以,并不意味着你应该”下归档。OK参数对于set和get是常见的。并且只有可选参数的功能,而不限制参数。例如,如果函数有两个参数int和string。然后,如果用户可以给出int或string,但不能同时给出两者。难道你不认为我们需要一种新的函数语法来实现这一点吗。索引器和函数不同,但参数部分相似。所以我提出了这个问题。@NithinB您需要使用方法重载,这对于可选参数的情况很方便。@NithinB我编辑了答案以回应您的评论,请看一看。我只需在函数Function1(int firstNumber=0,string secondNumber=null)的情况下编写此命令即可实现。但对用户传递的参数数量没有限制,例如可以传递第一个参数或第二个参数,但不能同时传递这两个参数。我想限制用户提供两个参数,比如编译时错误。是的,我知道有很多实现的可能性,比如添加新的索引器或函数。但是我们不能声明索引器类似于公共字符串this[(set)(get)intx,(get)string y]。这意味着get{}可以是