C#如何知道重载operator +是否为复合赋值(+ =)?

时间:2017-03-27 08:13:15

标签: c# operator-overloading

我有以下问题:

我可以静态地重载操作符+来添加一些自定义对象:

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

返回是一个新对象,它得到由运算符+求和的。这是完美的。

但写作时...

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,这将打破期望。

3 个答案:

答案 0 :(得分:0)

尝试

var sinon = require('sinon'),
    should = require('should');

require('sinon-stub-promise');

describe('test unit Tests', function(){
    describe('My first test', function(){
        it('should test a promise', function(){
            sinon.stub().resolves('foo')().then(function (value) {
            console.log('test');

            assert.equal(value, 'not foooo')
        })
    })
});

答案 1 :(得分:0)

a += b; a = a + b

的快捷方式

重复使用同一个对象或创建一个新对象是+运算符的全部责任。

从技术上讲,所有"标准" +的实现始终会创建新对象,但对于struct,您只是没有注意到。

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

答案 2 :(得分:-1)

您无法直接超载" + ="运营商,您可以在MSDN

了解更多信息

基本上,行为取决于你的" +"操作员超载。 (您正在该方法中创建新对象)