如下代码public class A
{
    public string GetString()
    {
        return "";
    }
}public class B
{        static readonly object _lock = new object();
        private static B _Method;
        public static B Method
        {
            get
            {
                if (_Method == null)
                {
                    lock (_lock)
                    {
                        _Method = new B();
                    }
                }
                return _Method;
            }
        }
    public string GetString()
    {
        return "";
    }
}public class C
{
    public static string GetString()
    {
        return "";
    }
}
对于如上三个类A B C,都有一个方法GetString,不同的是,他们调用GetString方法的方式
对于A 需要 A a=new A(); a.GetString,也就是先将A实例化后再调用
对于B 可以B.Method.GetString 这样调用
对于C 可以C.GetString()调用于是我有这样的疑问,这三种方式那个更好??
一般的来说一个类里面会有很多的方法、变量等等
那么我的疑问是那种对于系统的影响更小??如内存开销、磁盘读写等等
对于A,如果调用频繁,需要实例化很多A,那么会不会开销很多内存,如果GC回收不及时的话
对于B,是在类里面定义了B类的静态变量,对于这种访问方法,与C的静态方法有什么区别??对于以上方式,目前我都在使用,但是没有发现什么问题,可是如果调用多了,会不会对系统有什么影响?求高手或者深知C#精髓的高手来赐教一下,非常感谢!!!!

解决方案 »

  1.   

    呵呵,A需要创建实例,如果方法和实例无关,应该像C 那样定义为静态的,静态的优点也可以看到,不需要A a=new A();new一个对象其实开销还是很大的,降低速度,而且容易产生碎片,增加GC的负担,没什么好处,如果一个方法没有使用到实例成员,则应该设计为static,C是最好的,B其实是设计模式的单件模式,和C差不多,不过你的代码中,B还能实现多线程安全,其实在c#中B和C是等价的,C也可以加入静态成员实现线程安全,c#还有静态构造函数,对静态变量进行初始化,所以大多数情况下,C可以代替B方案,C和B对性能和GC等影响差别不大,不过B方案要多写代码,一般不会写成B,如果要对静态成员初始化,你可以用静态构造函数,B的方案在c++中有用,因为c++没有静态构造函数,但c#有了静态构造函数,B就没多大意义,
      

  2.   

    >对于A,如果调用频繁,需要实例化很多A,那么会不会开销很多内存,如果GC回收不及时的话是的,new的处理很复杂,本身就慢,还会产生小的对象,GC会回收A的时候,会导致系统变慢,影响性能,没什么好处,
      

  3.   

    多谢回复,对于B我有一个疑问,如下方法    public string GetString()
        {
            string a="234234";        return a;
        }方法内部有私有成员a,这样的话我用B.Method.GetString方法后,a成员变量会不会常留内存中??
      

  4.   

    你的例子不好,如果只是string的话,如果返回的内容没变化,直接用 const ,如果有变化的话,第二种较好,至少避免多次实例化带来的损失。
      

  5.   

    补充一下,.net里面有个字符池,当初始化字符串时,CLR会检查字符池有没有这个字符串。
      

  6.   

    如果是静态方法返回的是个对象或者是个List<T>,那么这个对象会不会常驻内存呢??
      

  7.   

    三种方式有不同的使用场合,不是性能哪个好就用哪个。(new A()).GetString() 这是最普通的,创建 object,然后调用实例方法,最普通的情况。
    B.Method.GetString()  当你希望你的类对象只有一个,不希望调用方自己创建对象的时候使用这个。
    C.GetString()         这种方式的调用无需实例变量,比如:System.Math.Sqrt(...),他只是方法的几个而已。