首页 新闻 会员 周边

从线程安全、性能、兼容性来看,为何实例方法更胜静态方法?

0
悬赏园豆:10 [已关闭问题]

如题

wildfire555的主页 wildfire555 | 初学一级 | 园豆:190
提问于:2009-03-11 12:15
< >
分享
其他回答(4)
0

各有各的好处。各有各的应用场合。
但是性能方面静态方法绝对比实例方法来得好。可以写一个循环来调用一下看谁比较快?每秒钟能调用多少次?

玛瑙王国--这里的玛瑙会说话 | 园豆:258 (菜鸟二级) | 2009-03-11 12:45
0

这个不一定呀...比如你看msdn 里面的directory 和directoryInfo这两个类,前一个类的方法都是静态的,但是msdn文档却说,如果你需要多次调用directory里面的方法,推荐用directoryInfo的实例方法,因为directory静态方法里面需要校验比较多的东西

波波塔 | 园豆:638 (小虾三级) | 2009-03-11 13:51
0

directory 和directoryInfo,不能用这个来推论。directoryInfo是经过优化的。做人不能太2.

什么是静态什么是实例,如果A静态方法与B实例方法都完成同样的功能,我建议你使用实例方法,实际上静态方法大多时候可以看成具有通用行为的函数,而是实例方法应该被视作具备优化算法的方案,算是一个子集把,这并不能代表实例优胜于静态,实例方法内部条用静态方法很常见,但理论上可以把实例方法视为比静态更优秀,不知道我这样说你明白与否。

LT | 园豆:97 (初学一级) | 2009-03-11 14:26
0

这个不好作评论

Assion Yang | 园豆:232 (菜鸟二级) | 2009-03-11 17:37
0

.Net Framework 提供的静态方法大多数是线程安全的,但实例方法大多数都不保证线程安全。

性能方面,我测试了一下,实例方法略快一点:

测试代码

    class Program
    {
        class A
        {
            public void Test()
            {
            }
        }

        static void Test()
        {
        }

        static void Main(string[] args)
        {
            A a = new A();

            CodeTimer.Time("Test static methed", 100000000, delegate() { Test(); });
            CodeTimer.Time("Test instance methed", 100000000, delegate() { a.Test();  });
            Console.ReadLine();
        }
    }

其中

CodeTimer 类见 http://www.cnblogs.com/eaglet/archive/2009/03/10/1407791.html

 

测试结果:

Test static methed
        Time Elapsed:           1,778ms
        Time Elapsed (one time):0ms
        CPU time:               1,781,250,000ns
        CPU time (one time):    17ns
        Gen 0:                  0
        Gen 1:                  0
        Gen 2:                  0

Test instance methed
        Time Elapsed:           1,626ms
        Time Elapsed (one time):0ms
        CPU time:               1,625,000,000ns
        CPU time (one time):    16ns
        Gen 0:                  0
        Gen 1:                  0
        Gen 2:                  0

eaglet | 园豆:17139 (专家六级) | 2009-03-11 19:21
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册