C#C# 之Static

疑问解答

  • 静态变量与非静态变量最大的分别是怎么?

 

 

style=”font-size: 12px;”>最大的区分在于内存的地点。静态变量的内存是在程序初阶执时变量就占用了内存,直到一切程序甘休时变量才获释内存.
非静态变量是在程序运维到该步的时候分配内存,并在实践完后活动销毁。所以:静态变量的值只会初始化一次,后边每一次访问,都是上次处理过的值。

 

 

  • 怎么静态变量不需求实例化就能访问。

style=”font-size: 12px;”>因为类在伊始化的时候,就早已为静态变量分配好了内存空间,不必要实例化就能精确找到它们的义务;而非静态成员必须在实例化类对象将来,才能显然它们的内存地方;因而也有这般的传教,静态成员是属于类,而非静态成员属于类的靶子

  • 为魏福祥态方法里面不可以访问非静态变量,也不可以创建非静态变量?

 

style=”font-size: 12px;”>因为非静态变量必要实例化才能确认其内存中的地方,才能调用,而静态函数是不需求实例化的,所以静态方法不恐怕接纳

 

  • 干什么方法内部无法声称静态变量?

style=”font-size: 12px;”>因为静态变量是类具有实例的共用变量,也等于在此类的局面内是个全局变量。而只要在点子内部定义静态变量,则会导致定义的静态变量是3个有的变量,如此定义自然会出错。

 

  • 静态成员的生命周期

style=”font-size: 12px;”>静态成员的生命周期是百分百应用程序域的活着周期.也等于从操作含有静态成员的类初叶,一向到全体应用程序截止。

 

静态方法

  • 应用

style=”font-size: 12px;”>静态方法一般用于频仍调用又不平日修改的地点。比如工具库方法、不须求实例化的点子、与具体事情毫无干系,执行相比较频仍,用的地点多的主意等。当然,那些特点也是因为静态方法无法被两次三番,不只怕进展扩展有关。

  • 操作顺序

style=”font-size: 12px;”>静态方法会在静态字段、静态构造函数都操作后才能被调用。

  • 特性
  1. style=”font-size: 12px;”>静态方法调用时不要求实例化类。
  2. style=”font-size: 12px;”>静态方法只可以引用静态方法、字段、属性。静态方法里无法有非静态变量。

  3. style=”font-size: 12px;”>静态方法一经调用,就不只怕销毁,除非整套应用程序域都终止了。所以静态函数不可以太多,否则一贯占有内存。

  4. style=”font-size: 12px;”>因为静态方法无法访问非静态变量,所以与非静态方法耦合度较低,有利于代码的改动。

  5. style=”font-size: 12px;”>静态方法的施行效能比非静态方法要高,可是因为其直接占据内存无法被销毁,所以无法反复使用静态方法。

 


背景

  • static来源

style=”font-size: 12px;”>在编排类的时候,有时候要求类里面的某些成员具有唯一性,也等于,对拥有的目的都保持惟有二个的情景。比如成立个人音信,大家都以炎黄种人,但总不能每种人都要封存多少个华夏人字段吧,用一个就够了

  • static作用

MSDN说:使用 static
修饰符申明属于类型作者而不是属于特定目的的静态成员。约等于说,用static修改的对象是多个类的上上下下分子,不属于有个别类特有的。比如,汽车有八个轮子,而不是某种轿车有多个车轱辘。

  • static特性

一 、访问不必要表明类对象。比如

Console.Write();//Write()这就是一个静态方法,不需要new Consolo();

贰 、static对象具备唯一性,无论是或不是爆发了目的或无论发生了稍稍对象的情形下,有个别特定的数额在内存空间里唯有一份。也等于说,你随便new多少类成员,静态变量唯有一个,要变都变。

 


 

静态字段

所谓静态字段,相当于有static修饰的字段啦。

  • 作用

style=”font-size: 12px;”>无论创制多少对象,静态字段代表的数额在内存空间中唯有3个。比如说系统时间,无论你安装了多少软件,想精通未来几点了,都唯有3个参考值,假使你改变了这一个日子,那么其余软件获取的时间也都更改了。(当然,只是比喻,具体咋访问时间的,小编不管)。

  • 操作顺序

style=”font-size: 12px;”>静态字段是在类操作(实例化、调用静态方法等)的时候第2个被实例化的靶子。第三个是静态构造函数,而且他们都只能被调用几遍。

  • 特性
  1. style=”font-size: 12px;”>因为静态成员自己就是为了大局唯一性而生的,当然静态成员在全体函数内部相当于了全局变量。
  2. style=”font-size: 12px;”>静态成员只可以被起始化五遍,就是在率先次对那些类举办操作的时候创制。其余对整个类举办操作的时候,因为静态成员已经有了,自然不会再成立。(就是给菜鸟写的废话,不然很多个人会有失常态,比如本人。)
  • 举例

C# 1

 

如上图,每一趟创造实例的时候,构造函数对三个字段展开+1,但是结果不平等,这就是static修饰的字段的唯一性。

 


 

静态构造函数

  • 作用

style=”font-size: 12px;”>静态构造函数一般用来早先化静态变量,不会先导化非静态变量;然则因为非静态构造函数也能操作静态变量,所以就比较少用静态构造函数了。

 

  • 操作顺序

style=”font-size: 12px;”>无论对类举办何种操作,静态构造函数总是除了静态字段以外第2个被操作的章程,比非静态参数、非静态构造函数都要提早。

  • 特性
  1. style=”font-size: 12px;”>只好操作静态成员,因为非静态成员须要实体引用。
  2. style=”font-size: 12px;”>整个生命周期只会运转四回,且不可被调用。
  3. style=”font-size: 12px;”>静态构造函数不可以有修饰符,因为唯有系统才能调用,有没有public都不算;它也无法有输入参数。
  4. style=”font-size: 12px;”>假使类里面含有Main方法,则先实施静态构造函数;

 

  • 举例

 

class A
    {
        public static int X;

        static A()
        {
            X = B.Y + 1;
        }
    }
    class B
    {
        public static int Y = A.X +1;
        static B()
        {
        }

        static void Main(string[] args)
        {
            Console.WriteLine(string.Format("Y={0}, X={1}", B.Y, A.X));//Y=2, X=1;
            Console.ReadLine();          
        }
    }

 

那是网上二个很出名的static的例证,倘诺不看答案,可以算出来才是本事。

  1. 首先,Main()方法在B类里面,所以要求先调用B类。

  2. 进去B类,先对静态字段Y分配空间,并暗中认同赋值为0;注意,在此地Y已经开首化好了。

  3. 因为Y=A.X+1;所以操作A类的静态字段,未来进入A类。

  4. 同样的,先对A类的X分配空间并赋值为0。然后X=B.Y+1,B.Y已经存在了,为0,所以X=B.Y+1执行完后,X
    = 1。

  5. 调用A的静态构造函数。

  6. 完成Y的赋值,Y=A.X +
    1,Y=2。

  7. 调用B的静态构造函数。

  8. 此刻才会调用Main()方法,因为A.X,B.Y都形成了初步化并赋值,所以平素写出答案。

可知将完全的顺序描述出来,static一般的面试题都难不住你了!

 


 

相关文章