【问题标题】:C# how to know if overload operator+ is a compound assignment (+=)?C#如何知道重载运算符+是否是复合赋值(+=)?
【发布时间】:2017-03-27 08:13:15
【问题描述】:

我有以下问题:

我可以静态重载 operator+ 来添加一些自定义对象:

public static obj operator+(obj A, obj B)
{
    obj ret = new obj();
    ret.magic = A.magic + B.magic;
    return ret;
}

返回的是一个新对象,它得到了 whatever 由 operator+ 求和。这是完美的。

但是写的时候……

obj A, B;
/* ... */
A += B;

这不会增加A,它会构造一个新的A。所以A不只是持有一个新的值,它是一个全新的对象,这不是我写A += B时想要的。

那么像我在 C++ 中那样重载一元赋值运算符的 C# 方法是什么?

因为,在上面的静态运算符+ - 函数中,只需省略第一行,A 在以下情况下就会发生变化:

obj C = A + B;

所以,原因很明显:

A += B 之后,A 应该仍然是相同的对象。

当然,我可以按照应有的方式实现它:

public obj add(obj B)
{
    magic += B.magic;
    return this;
}

public static obj operator+(obj A, obj B)
{
    obj ret = new obj();
    ret.magic = A.magic;
    ret.add(B);
    return ret;
}

但是,它仍然不会在A += B 上被调用,这将超出预期。

【问题讨论】:

标签: c# operator-overloading


【解决方案1】:

试试

public static obj operator+(obj a, obj b)
{
    a.magic += b.magic;
    return a;
}

【讨论】:

  • 那会改变 obj c = a + b; 中的 a;
  • 这段代码运行良好。它用总和值修改了 obj a 的属性。你试过这个代码@rhavin 吗?它没有给出正确的值吗?
【解决方案2】:

a += b; a = a + b的快捷方式

因此重用同一个对象或创建新对象是+ 操作员的全部责任。

从技术上讲,+ 的所有“标准”实现总是会创建新对象,但对于 structs,您只是不会注意到这一点。

您可以实现您的 + 逻辑,它只返回左操作数。

【讨论】:

  • 嗯,在 c++ 中它不是。那里是“用 b 修改 a”而不是“创建新的匿名,用 a 和 b 修改它并重新分配给 a”——这显然不是我需要的。
  • @rhavin 这是 C# 问题。
  • 是的,这就是为什么我要问如何在 C# 中做到这一点。
  • @rhavin - 试着理解你已经得到的答案。我在这里和下面的@Sty 向您展示了如何以使用提供的对象而不是创建新对象的方式实现+ - 这只是+ 运算符中的您的 代码。
  • 请尝试理解问题,而不是为不同的东西提供解决方案。
【解决方案3】:

您不能直接重载“+=”运算符,您可以在MSDN阅读更多内容

基本上,行为取决于您的“+”运算符重载。 (您正在该方法中创建新对象)

【讨论】:

  • 因为陈述我已经知道的事情(在标题中!)而根本没有解决问题。
  • @rhavin 问题很明显,我在大括号中说明了,如果你想让A 成为同一个对象,则不能创建新对象。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2020-04-17
  • 1970-01-01
  • 2013-03-30
  • 2016-08-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多