我有以下问题:
我可以静态地重载操作符+来添加一些自定义对象:
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
,这将打破期望。
答案 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
了解更多信息基本上,行为取决于你的" +"操作员超载。 (您正在该方法中创建新对象)