Rob*_*d70 10 c# post-increment
所以,如果我执行以下代码......
int x = 0;
Debug.WriteLine(x++);
Debug.WriteLine(x += 4);
Debug.WriteLine(x);
Run Code Online (Sandbox Code Playgroud)
......我分别得到0,5和5.我想得到的是0,1和5.在C#中有没有办法用n进行后递增?或者我必须写出+ =作为自己的陈述?
仅仅是为了上下文,我实际上正在做的是缓冲区上的一堆BitConverter操作,并且将每个操作作为一个自给自足的语句非常好,其中偏移量增加了数据类型的大小.转换成.这样,如果稍后更改缓冲区格式,我可以添加或删除一行,而不必担心任何周围的代码.
您应该能够滥用Interlocked.Exchange来获取变量的旧值,同时替换它的值:
Debug.WriteLine(Interlocked.Exchange(ref x, x+4));
Run Code Online (Sandbox Code Playgroud)
换句话说,用变量值替换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
Run Code Online (Sandbox Code Playgroud)
这个(和其他)解决方案的非直观性可能归结为违反CQS原则 - 我们正在改变一个变量并一次性返回一个值,即不是我们应该在主流中做的事情.