所以,如果我执行以下代码......
int x = 0;
Debug.WriteLine(x++);
Debug.WriteLine(x += 4);
Debug.WriteLine(x);
...我分别得到0,5和5。我想得到的是0,1和5.在C#中有没有办法用n进行后递增?或者我必须写出+ =作为自己的陈述吗?
仅仅是为了上下文,我实际上在做的是缓冲区上的一堆BitConverter操作,并且将每个操作作为一个自给自足的语句非常好,其中偏移量增加了要转换为的数据类型。这样,如果稍后更改缓冲区格式,我可以添加或删除一行,而不必担心任何周围的代码。
答案 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 +=
,因为任何其他方式运算符重载或其他东西;只是一个开销。