繁体   English   中英

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

[英]Post-increment x by n (n != 1)

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

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

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

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

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

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

换句话说,用x + 4替换变量x的值,但返回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原则 - 我们正在改变一个变量并一次性返回一个值,即不是我们应该在主流中做的事情。

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

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);
}

Operator ++x = x + 1;缩写形式x = x + 1; 所以使用+=并不是一个坏主意:

如果我理解正确的话:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM