更好地使用setter和getter

Ron*_*den 1 oop getter setter actionscript-3

我有一个关于魔法getter和setter的问题.

我的问题是:什么是更好(更快,更安全)?

PS这是ActionScript 3,但也可以回答PHP,JavaScript,C#等其他语言的问题.

情况1

    public class Test extends Sprite
    {
        private var _test : uint = 0;

        public function Test()
        {
            start();
        }

        private function start() : void
        {
            trace(_test); ** Take the private var _test **
        }

        public function set test(value : uint) : void
        {
            _test = value;
            start();
        }

        public function get test() : uint
        {
            return _test;
        }
   }
Run Code Online (Sandbox Code Playgroud)

或案例2

    public class Test extends Sprite
    {
        private var _test : uint = 0;

        public function Test()
        {
            start();
        }

        private function start() : void
        {
            trace(test); ** difference here, take the public function test **
        }

        public function set test(value : uint) : void
        {
            _test = value;
            start();
        }

        public function get test() : uint
        {
            return _test;
        }
   }
Run Code Online (Sandbox Code Playgroud)

什么是最好(最快)的方式?

谢谢!

Mar*_*rty 5

您大约有90%的时间来编写自己的测试用例来了解自己.

getter和setter旨在添加对设置或检索属性时发生的事件的控制,或者创建只读或只写属性.

这些好处大大超过了任何可能的性能差异.


至于那些性能差异,这里是一个测试环境:

// Test property.
var _test:uint = 0;
function get test():uint{ return _test; }
function set test(value:uint):void{ _test = value; }

// Direct access test.
function directTest(amt:int):Number
{
    // Directly accessing the property.
    var t:Number = getTimer();
    for(var i:int = 0; i < amt; i++)
    {
        var temp:uint = _test;
        _test = i;
    }

    return getTimer() - t;
}


// Getter/setter test.
function viaTest(amt:int):Number
{
    // Via getter/setter.
    var t:Number = getTimer();
    for(var i:int = 0; i < amt; i++)
    {
        var temp:uint = test;
        test = i;
    }

    return getTimer() - t;
}
Run Code Online (Sandbox Code Playgroud)

快速演示如何使用它:

trace("Direct: " + directTest(1000000));
trace("Getter/Setter: " + viaTest(1000000));
Run Code Online (Sandbox Code Playgroud)

我得到了一些结果:

Amount      Direct      Get/Set
1000        0           0
5000        0           0
20,000      0           2
150,000     1           14
500,000     2           46
2,000,000   10          184
10,000,000  47          921
Run Code Online (Sandbox Code Playgroud)