后增量x乘n(n!= 1)

时间:2013-12-09 05:00:52

标签: c# post-increment

所以,如果我执行以下代码......

int x = 0;
Debug.WriteLine(x++);
Debug.WriteLine(x += 4);
Debug.WriteLine(x);

...我分别得到0,5和5。我想得到的是0,1和5.在C#中有没有办法用n进行后递增?或者我必须写出+ =作为自己的陈述吗?

仅仅是为了上下文,我实际上在做的是缓冲区上的一堆BitConverter操作,并且将每个操作作为一个自给自足的语句非常好,其中偏移量增加了要转换为的数据类型。这样,如果稍后更改缓冲区格式,我可以添加或删除一行,而不必担心任何周围的代码。

3 个答案:

答案 0 :(得分:6)

您应该能够滥用Interlocked.Exchange来获取变量的旧值,同时替换其值:

Debug.WriteLine(Interlocked.Exchange(ref x, x+4));

换句话说,将变量x的值替换为x + 4,但返回之前的x值。

修改

反汇编显示这个“增量4和交换”是在4条指令中完成的 - 根本不需要调用,因此性能应该很好:

            Interlocked.Exchange(ref x, x + 4);
0000005e  mov         eax,dword ptr [rbp+2Ch] 
00000061  add         eax,4 
00000064  xchg        eax,dword ptr [rbp+2Ch] 
00000067  mov         dword ptr [rbp+28h],eax 

此(以及其他)解决方案的 非直观 性质可能归结为违反CQS principle - 我们正在改变变量并返回一次性的价值,即不是我们应该在主流中做的事情。

答案 1 :(得分:4)

据我所知,这是不可能的。你可以编写你的包装器方法:

static void ExecuteWithPost(ref int value, Action<int> operation, Func<int, int> postOperation)
{
    operation(value);
    value = postOperation(value);
}

并使用它:

int i = 0;
ExecuteWithPost(ref i, x => Debug.WriteLine(x), x => x + 1);
ExecuteWithPost(ref i, x => Debug.WriteLine(x), x => x + 4);
ExecuteWithPost(ref i, x => Debug.WriteLine(x), x => x);

打印你想要的东西。

包装器方法可以是通用的,使其适用于int以外的类型:

static void ExecuteWithPost<T>(ref T value, Action<T> operation, Func<T, T> postOperation)
{
    operation(value);
    value = postOperation(value);
}

答案 2 :(得分:0)

运营商++x = x + 1;的缩写形式,因此使用+=并不是一个坏主意:

如果我理解正确的话:

int x = 0;
Debug.WriteLine(x++);  //return 0
Debug.WriteLine(x);  //return 1
Debug.WriteLine(x += 4);  //return 5

我建议你使用operator +=,因为任何其他方式运算符重载或其他东西;只是一个开销。