代码之家  ›  专栏  ›  技术社区  ›  Nick Larsen

C在同一类函数中将实例变量复制到局部变量

  •  6
  • Nick Larsen  · 技术社区  · 14 年前

    最近,我在一个开源项目中查找了一些代码,发现了许多此类代码:

    class SomeClass
    {
        private int SomeNumber = 42;
    
        public ReturnValue UseSomeNumber(...)
        {
            int someNumberCopy = this.SomeNumber;
            if (someNumberCopy > ...)
            {
                // ... do some work with someNumberCopy
            }
            else
            {
                // ... do something else with someNumberCopy
            }
        }
    }
    

    复制实例变量有什么实际好处吗?

    6 回复  |  直到 14 年前
        1
  •  7
  •   kemiller2002    14 年前

    不,除非您不想更改somenumber的值并且打算更新somenumbercopy。比如,如果你要循环次数,然后将某个数字减到零,以跟踪计数。

    我想复制这样的变量可以保护您不受一些外部函数的影响,在执行操作时改变某个数字,并且在您不知情的情况下改变它。如果该类应该在多线程应用程序中使用,我可能会看到这一点。也许他不是我想说的那样,但那可能是作者的意图。

        2
  •  9
  •   Alex F    14 年前

    可能这是多线程程序的一部分。尽管此代码不是线程安全的,但它确保一旦分配了复制变量,其他线程就不会对其进行更改,并且之后的所有函数代码都会一致运行。

    在多线程环境中,具有事件的类似代码变得至关重要:

    MyEvent e = this.myEvent;
    
    if ( e != null )
    {
        e();
    }
    

    在这里,如果在测试空值之后和调用之前事件变为空值,则在不进行本地复制的情况下,可以获取空指针异常。

        3
  •  1
  •   David Basarab    14 年前

    // ... do some work with someNumberCopy 用数字拷贝做些什么?它会改变价值吗?是否将其传递给可能更改值的方法?

    如果没有,就没有好处。

        4
  •  1
  •   Henk Holterman    14 年前

    你漏掉了一些重要的细节。
    如果有多个线程访问somenumber和此方案:

        int someNumberCopy = this.SomeNumber;
        if (someNumberCopy > x)
        {
            // do some work with someNumberCopy
            // that relies on (someNumberCopy > x) == true
        }
    

    那么制作一份副本就很重要了。

        5
  •  1
  •   Davy8    14 年前

    如果 this.SomeNumber 可以由另一个线程修改,但在该方法的持续时间内,重要的是 someNumberCopy 无法更改(它可能与 SomeNumber )那么这可能是可行的,否则我看不出原因。

        6
  •  0
  •   rossoft    14 年前

    我看到的唯一好处是为该方法提供变量的“只读版本”。