zoukankan      html  css  js  c++  java
  • 深入理解 静态类和静态字段(C# 基础)

    序言

    以前,总是被提醒,在编程过程中尽量少用静态变量,数据丢失什么的,今天有空,禁不住对静态变量的强烈好奇,跟我一起了解下静态家族的内幕吧。

    静态类

    定义

    静态类与非静态类的重要区别在于静态类不能实例化,也就是说,不能使用 new 关键字创建静态类类型的变量。在声明一个类时使用static关键字,具有两个方面的意义:首先,它防止程序员写代码来实例化该静态类;其次,它防止在类的内部声明任何实例字段或方法。

    静态类是自C# 2.0才引入的,C# 1.0不支持静态类声明。程序员必须声明一个私有构造器。私有构造器禁止开发者在类的范围之外实例化类的实例。使用私有构造器的效果与使用静态类的效果非常相似。

    私有构造器与静态类的区别:1)私有构造器方式仍然可以从类的内部对类进行实例化,而静态类禁止从任何地方实例化类,其中包括从类自身内部;2)在使用私有构造器的类中,是允许有实例成员的,而C# 2.0和更高版本的编译器不允许静态类有任何实例成员。

    使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员,编译器将保证不会创建此类的实例。静态类的另一个特征在于,C#编译器会自动把它标记为sealed。这个关键字将类指定为不可扩展;换言之,不能从它派生出其他类。

    静态类的主要特性:

    1.仅包含静态成员

    2.无法实例化

    3.是密封的

    4.不能包含实例构造函数。

    生命周期

    当加载引用静态类的程序时,.NET Framework 公共语言运行时 (CLR) 将加载该静态类的类型信息,程序不能指定加载静态类的确切时间。但是,可以保证在程序中首次引用该类前加载该类,初始化该类的字段并调用其静态构造函数。 静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。

    也就是说,当页面第一次被访问的时候,相当于页面被构造,静态变量被静态构造器初始化,然后再次访问这个页面的时候,虽然非静态资源重新被构造,但是此时静态资源并不被重新构造并一直存在。

    静态成员

    定义

    非静态类可以包含静态的方法、字段、属性或事件。即使没有创建类的实例,也可以调用该类中的静态成员。

    始终通过类名而不是实例名称访问静态成员。

    无论对一个类创建多少个实例,它的静态成员都只有一个副本。

    静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例变量(除非在方法参数中显式传递)

    静态方法可以被重载但不能被重写,因为它们属于类,不属于类的任何实例。

    虽然字段不能声明为 static const,但 const字段的行为在本质上是静态的。这样的字段属于类型,不属于类型的实例。 因此,可以同对待静态字段一样使用 ClassName.MemberName 表示法来访问 const 字段。不需要对象实例。

    C# 不支持静态局部变量(在方法范围内声明的变量)

    静态字段被类的所有实例所共享,即此类的所有实例都访问同一内存地址。

    静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值。

    生命周期

    静态成员在第一次被访问之前并且在调用静态构造函数(如有存在)之前进行初始化,此后一直保持在内存中,直到应用程序域的生命周期结束。

    小结

    静态字段一旦被使用,便会一直存在内存中直到程序生命周期结束。所以使用静态成员会很占用内存资源。

    如果非静态类中含有静态成员,则无论类被创建多少次,静态成员是不变的。

    另外,使用静态类或者静态成员应该考虑线程安全,即在多线程的情况下静态资源的占用问题。

    参考:http://www.cnblogs.com/devinzhang/archive/2012/02/09/2344105.html

  • 相关阅读:
    42. Trapping Rain Water
    223. Rectangle Area
    645. Set Mismatch
    541. Reverse String II
    675. Cut Off Trees for Golf Event
    安装 VsCode 插件安装以及配置
    向上取整 向下取整 四舍五入 产生100以内随机数
    JS 判断是否为数字 数字型特殊值
    移动端初始配置,兼容不同浏览器的渲染内核
    Flex移动布局中单行和双行布局的区别以及使用
  • 原文地址:https://www.cnblogs.com/lipanpan/p/3976665.html
Copyright © 2011-2022 走看看