【问题标题】:c# operator overloading usagec#运算符重载用法
【发布时间】:2013-02-17 16:58:08
【问题描述】:
public static ListOfPeople operator +( ListOfPeople x, Person y)
    {
        ListOfPeople temp = new ListOfPeople(x);
        if(!temp.PeopleList.Contains(y))
        {
            temp.PeopleList.Add(y);
        }
        temp.SaveNeeded = true;
        return temp;
    }

所以,我从未使用过运算符的重载功能,我正在尝试了解如何将对象从我的类 (Person) 添加到我的 Collection 类 (ListOfPeople)。

ListOfPeople 包含一个属性List<Person> PeopleList

我的困难在于如何在这个方法中获取一个预先存在的 List 来添加一个新的 Person 。 ListOfPeople temp = new ListOfPeople(x);

我在这一行有一个错误,因为我没有接受 ListOfPeople 参数的构造函数。如果我将其设为ListOfPeople temp = new ListOfPeople();,那么 Temp 只会调用我的默认构造函数,我只需在其中创建一个新的空列表,这也不允许我添加到预先存在的列表中。

我只是不确定如何让 'temp' 实际引用我预先存在的列表。

【问题讨论】:

  • 您不应使用 + 运算符将项目添加到集合中。我相信这甚至被作为一个例子给出了运算符重载应该被使用。
  • 嗯,它正在将一个对象添加到包含在 Collection 类中的 List 中。这仍然同样糟糕吗?
  • 是的,看看其他.NET列表如何实现添加项,总是通过Add方法。
  • 我个人不会以这种方式使用运算符 - 对于 .NET 来说不是惯用的;但是如果我这样做了 - 我不会进行Contains 检查。如果有人想多次添加它,那是他们的问题。

标签: c# overloading operator-keyword


【解决方案1】:

如下使用:

public static ListOfPeople operator +( ListOfPeople x, Person y)
{
    ListOfPeople temp = x;
    if(!temp.PeopleList.Contains(y))
    {
        temp.PeopleList.Add(y);
    }
    temp.SaveNeeded = true;
    return temp;
}

public static ListOfPeople operator +( Person y, ListOfPeople x)
{
    ListOfPeople temp = x;
    if(!temp.PeopleList.Contains(y))
    {
        temp.PeopleList.Add(y);
    }
    temp.SaveNeeded = true;
    return temp;
}
  • 第一个允许你使用:list = list + person
  • 第二个允许你使用:list = person + list

您可能还想重载+= 运算符(非静态),以便可以使用list += person

编辑

虽然我解决了提到的问题。但是,我同意其他人关于“+”操作数不可变的观点。

以下是对现有代码的更新(假设ListOfPeople.PeopleList is List<Person>):

public static ListOfPeople operator +( ListOfPeople x, Person y)
{
    ListOfPeople temp = new ListOfPeople();
    temp.PeopleList.addRange(x);
    if(!temp.PeopleList.Contains(y))
    {
        temp.PeopleList.Add(y);
    }
    temp.SaveNeeded = true;
    return temp;
}

public static ListOfPeople operator +( Person y, ListOfPeople x)
{
    ListOfPeople temp = new ListOfPeople();
    temp.PeopleList.addRange(x);
    if(!temp.PeopleList.Contains(y))
    {
        temp.PeopleList.Add(y);
    }
    temp.SaveNeeded = true;
    return temp;
}

【讨论】:

  • 我认为 += 是隐含的,一旦你定义了 +?
  • 我的错。是的。 += 解析为 +。 LH 操作数取决于 += 的 LHS。见msdn.microsoft.com/en-us/library/sa7629ew.aspx
  • 我真的很不鼓励这样的事情!它暗示了一些没有被给予的东西!使用 (a+b) 我希望 a 保持不变,我会得到一个新的结果。使用您的代码,无论您是否分配值,列表都会改变!
  • 同意@JustAnotherUseYouMayKnow 写的:)
猜你喜欢
  • 1970-01-01
  • 2016-02-19
  • 1970-01-01
  • 2016-04-08
  • 2012-06-02
  • 2014-01-14
  • 2013-03-23
  • 2013-12-03
相关资源
最近更新 更多