【问题标题】:Overloading the subtraction operator for removing object重载减法运算符以删除对象
【发布时间】:2013-02-19 02:23:39
【问题描述】:
case Choices.ADD_PERSON:
                    Console.WriteLine("enter info for person to add.");
                    InfoForPerson();
                    PersonList Z = x + p;
                    break;

case Choices.REMOVE_PERSON:
                    Console.WriteLine("enter info for person to remove: ");
                    InfoForPerson();
                    Z = x - p;
                    break;

如果从菜单中选择它们的选项,会发生两件事。对于Choices.ADD_PERSON,结果符合预期,并添加了一个人。但是,我假设 + & - 会以完全相同的方式起作用,只是相反,但它并没有发生。

public static PersonList operator -(PersonList x, Person y)
    {
        PersonList temp = x;
        if (temp._Plist.Contains(y))
        {
            temp._Plist.Remove(y);
        }
        return temp; }

以上是我对减法运算符的定义。下面是我用来允许用户选择要添加/减去的人的代码。

public static void InfoForPerson()
    {
        Console.Write("Enter your name: ");
        string name = Console.ReadLine();
        string phone = ValidPhone();
        string email = ValidEmail();
        p = new Person(name, phone, email);

它适用于加法,而不是减法。我看了 p 并且它保存的数据很好,但它与列表中已经存在的项目不匹配。

【问题讨论】:

  • 为了在“列表”中添加/删除而重载 +/- 真的是个好主意吗?这似乎是编写非常不直观的代码的秘诀。
  • 我已经编辑了你的标题。请参阅“Should questions include “tags” in their titles?”,其中的共识是“不,他们不应该”。
  • 我同意 sapi。请不要这样做。添加一个 Remove 方法,而不是尝试重新定义其他运算符来做一些与每个人认为他们会做的不同的事情。
  • @user1993843 用于对自定义类进行数学运算。例如,如果您要创建自己的 DegreesRadians 类,那么与它们一起使用 +- 会很有意义。或者例如,将两个DateTime 对象相减得到一个TimeSpan。在List 上使用它通常是非常规的,你几乎总是看不到它。 (至少,直到今天我才拥有!)
  • 昨天你问这个关于加法运算符的问题:很多人告诉你这是一种反模式,或者至少非常不习惯。描述减法运算符时没有任何变化,自昨天以来也没有任何变化。

标签: c# overloading operator-keyword


【解决方案1】:

正如@sapi 和@TheEvilPenguin 已经指出的那样,这种类型的运算符重载是不受欢迎的,原因有很多。然而,这并不能回答你的问题。

如果没有更多关于您在 Z = x - p 语句中从何处获得 p 的信息,我怀疑您的问题是 p 不是列表中存在的元素。

请记住,ContainsRemove 仅对列表中对象的特定实例有效。

List<Tuple<int, int>> collection = new List<Tuple<int, int>>();
collection.Add(new Tuple<int, int>(1, 1));
if (collection.Contains(new Tuple<int, int>(1, 1))
{
    Console.WriteLine("This will NEVER happen.");
}
collection.Remove(new Tuple<int, int>(1, 1);
Console.WriteLine("{0}", collection.Count); // => 1

如果您想测试是否存在与测试值具有相同属性的类型的任何实例,那么Contains 不会这样做。

另外一点,- 运算符不应该(有人会说必须不)修改左边的操作数。您应该返回一个包含过滤项的新列表,因为这是 A - B 的语法操作。

【讨论】:

    【解决方案2】:

    您用于_Plist 的任何类型的列表(或集合)都需要支持将Person 匹配为“值”(如果引用则为默认值)。您可以将自定义比较器传递给 Contains 函数,也可以在 Person 上实现 EqualsGetHashCode 以比较所有属性。

    注意:正如大家所说,在非数学相关的课程中使用 +/- 会导致代码不直观。 IE。你已经有奇怪的行为 - 如果元素不存在 - 将什么也不做。数字永远不会发生这种情况:whatever -2 永远不会等于 whatever

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-18
      • 2021-07-18
      • 1970-01-01
      • 2020-10-07
      • 1970-01-01
      相关资源
      最近更新 更多