【转】静态类与非静态类

静态类

  继承(多态)、静态本身就是相反的。另外需要知道属性、事件其实是些特殊的方法。

  使用 static 修饰符声明属于类型本身而不是属于特定对象的静态成员。 static 修饰符可用于类、字段、方法、属性、运算符、事件和构造函数,但不能用于索引器、析构函数或类以外的类型。

  静态类与非静态类基本相同,但存在一个区别:静态类不能实例化。 也就是说,不能使用 new 关键字创建静态类类型的变量。 因为没有实例变量,所以要使用类名本身访问静态类的成员

  对于 只对输入参数进行运算 而不获取或设置 任何内部实例字段的方法集,静态类可以方便地用作这些方法集的容器。 例如,在 .NET Framework 类库中,静态类 System.Math 包含的方法只执行数学运算,而无需存储或检索特定 Math 类实例特有的数据。 就是说,通过指定类名称和方法名称来应用类成员。

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

下表介绍静态类的主要特性:

  • 仅包含静态成员。
  • 无法实例化。
  • 是密封的。
  • 不能包含实例构造函数。

  因此,创建静态类与创建仅包含静态成员和私有构造函数的类基本相同。 私有构造函数阻止类被实例化。使用静态类的优点在于,编译器能够执行检查以确保不致偶然地添加实例成员。编译器将保证不会创建此类的实例。

  静态类是密封的,因此不可被继承。 它们不能从除 Object 外的任何类中继承。 静态类不能包含实例构造函数,但可以包含静态构造函数。 如果非静态类包含需要进行重要的初始化的静态成员,也应定义静态构造函数。

静态类构造函数

  静态构造函数用于初始化任何 静态 数据,或用于执行仅需执行一次的特定操作。 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数。

例如:

class SimpleClass

{   static readonly long baseline;

    static SimpleClass()

    { baseline = DateTime.Now.Ticks; }

}

  静态构造函数具有以下特点:

  • 静态构造函数既没有访问修饰符,也没有参数。
  • 在创建第一个实例或引用任何静态成员之前,将自动调用静态构造函数来初始化类。
  • 无法直接调用静态构造函数。
  • 在程序中,用户无法控制何时执行静态构造函数。
  • 静态构造函数的典型用途是:当类使用日志文件时,将使用这种构造函数向日志文件中写入项。
  • 静态构造函数在为非托管代码创建包装类时也很有用,此时该构造函数可以调用 LoadLibrary 方法。
  • 如果静态构造函数引发异常,运行时将不会再次调用该构造函数,并且在程序运行所在的应用程序域的生存期内,类型将保持未初始化。

静态成员

  非静态类可以包含静态的方法、字段、属性或事件。 即使没有创建类的实例,也可以调用该类中的静态成员。 始终通过类名而不是实例名称访问静态成员。 无论对一个类创建多少个实例,它的静态成员都只有一个副本。 静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例变量(除非在方法参数中显式传递)。

  更常见的做法是声明具有一些静态成员的非静态类,而不是将整个类声明为静态类。 静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值。

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

  虽然字段不能声明为 static const,但 const 字段的行为在本质上是静态的。 这样的字段属于类型,不属于类型的实例。

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

  通过在成员的返回类型之前使用 static 关键字可以声明静态类成员,也就是在方法的返回类型前加static。

  静态成员在第一次被访问之前并且在调用静态构造函数(如有存在)之前进行初始化。 若要访问静态类成员,应使用类名而不是变量名来指定该成员的位置。

自问自答,自娱自乐

  静态成员与实例成员的性能对比和生成调用指令的差别有哪些?

  对静态方法的调用以 Microsoft 中间语言 (MSIL) 生成调用指令,而对实例方法的调用生成 callvirt 指令,该指令还检查 null 对象引用。 但是,两者之间的性能差异在大多数时候并不明显。

  为什么静态类不能被继承?

  经反编译查看,Static内部是用sealed和abstract两个关键字组合实现的,也就是说没有static这个关键字,只是为了方便区别。

  静态类的使用和实例类中静态成员的使用技巧?

  对于 只对输入参数进行运算 而不获取或设置 任何内部实例字段的方法集,静态类可以方便地用作这些方法集的容器。也就是说,这个类只是一个工具类,里面都是些方法。

  常见的做法是声明具有一些静态成员的非静态类,而不是将整个类声明为静态类。由于无论对一个类创建多少个实例,它的静态成员都只有一个副本,所以静态字段有两个常见的用法:一是记录已实例化对象的个数,二是存储必须在所有实例之间共享的值。

  静态类和非静态类之间的包含关系?

  非静态类可以包含静态类成员,静态类只能包含静态成员。如下所示:

  Static class staticclass{//只能是静态成员};

  Class newClass{//可以包含静态成员};

  尽管类的实例包含该类所有实例字段的单独副本,但每个静态字段只有一个副本。

 静态类成员声明字段的特殊性:

class Test

{  static int x = y;

   static int y = 5;

   static void Main() {

      Console.WriteLine(Test.x);

      Console.WriteLine(Test.y);

      Test.x = 99;

      Console.WriteLine(Test.x);}

}/*Output: 0  5  99  */

  什么情况下需要在一个普通类中编写一个静态成员,而这个类不能标记static?

  当这个需要被实例化的时候,如果这个类中有一个成员是所有对象都共享的数据,这时可以将该类中的这个成员标记为静态的,但是这个类还是一个实例类。

特别需要注意的有哪些呢?   

  1. 静态成员会在整个应用程序退出时,才释放资源,所以可以在整个应用程序中共享数据。
  2. 当一个普通类添加静态字段后,系统会默认为该类生成一个静态构造函数【静态构找函数不能有访问修饰符,并且也不能带参数】
  3. 静态方法可以被重载但不能被重写,因为它们属于类,不属于类的任何实例。
  4. 不可以使用 this 来引用静态方法或属性访问器。
  5. 类和静态类可以有静态构造函数。 静态构造函数在程序开始和类实例化之间的某个时刻调用。
  6. 静态类的本质是abstract+sealed组成。静态类不能被实例化是因为abstract,不能被继承是因为sealed。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/437749.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python 数据分析三剑客之 NumPy(三):数组的迭代与位运算

CSDN 课程推荐:《Python 数据分析与挖掘》,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

Python 数据分析三剑客之 NumPy(四):字符串函数总结与对比

CSDN 课程推荐:《Python 数据分析与挖掘》,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

【转】Microsoft Teams快速上手系列-02Teams组成概述及使用分享

在上一篇博客中介绍了Teams的前世今生,大家对Teams已经有了一个初步的认识,但是如上一篇文章中所说Teams是一个集成度很高的云协作平台,具体应该怎么去有效的利用起来呢?接下来这篇博客给大家全方位的分享一下Teams的组成部分以及…

Python 数据分析三剑客之 NumPy(五):数学 / 算术 / 统计 / 排序 / 条件 / 判断函数合集

CSDN 课程推荐:《Python 数据分析与挖掘》,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

【转】ASP.NET内幕 - IIS处理模型

介绍 微软的Active ServerPages,即ASP,自1996年首次发布以来,为Web开发者构建Web应用提供了一个丰富、复杂的框架。过去的几年它的基础架构发展的如此迅速,成为目前大家了解的ASP.NET,已经不再象它的前身。ASP.NET是构…

沉淀一年零八个月,我也拿到了博客专家

回忆 第一篇文章的发布是在 2018.08.30,虽然注册 CSDN 已有三年多了,但一直都是白嫖大佬们的文章,没有自己写东西,回想起刚开始写博客,最开始并不是在 CSDN 的,在我大二上学期的时候,网上冲浪发…

JAVA-入门(内含jdk配置)

title: java入门 date: 2019-07-21 19:50:19 tags: java学习 top: 1 JAVASE学习 1.java入门 More info: Writing //超链接 2.java开发环境配置 第一步是配置本地开发环境,学习最基本的桌面开发,下面以win10为例配置Java开发环境,即&#…

【转】EF三种编程方式的区别Database first ,Model first ,code first

首先对于EF中先出现的datebase first和model first两种编程方式,其的区别根据字面意思很容易能够理解。 datebase first就是代表数据库优先,那么前提就是先创建数据库。 model first就是代表model优先,那么前提也就是先创建model&#xf…

Python 数据分析三剑客之 NumPy(六):矩阵 / 线性代数库与 IO 操作

CSDN 课程推荐:《Python 数据分析与挖掘》,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

【转】学习Entity Framework 中的Code First

这是上周就写好的文章,是在公司浩哥的建议下写的,本来是部门里面分享求创新用的,这里贴出来分享给大家。 最近在对MVC的学习过程中,接触到了Code First这种新的设计模式,感觉很新颖,并且也体验到了这种方式…

HDFS--分布式文件系统

HDFS–分布式文件系统 1.Hadoop生态系统简介 2.HDFS基本架构 3.HDFS的核心原理 4.shell命令行操作 5.JAVAAPI的操作 6.HDFS集群运维与调优经验

Hbase搭建-基于hadoop3--并且解决了hbase error: KeeperErrorCode = NoNode for /hbase/master错误

Hbase搭建-基于hadoop3 habse搭建在下面。。上面写有一些我遇到的很烦躁的错误,捣鼓了两天!!! **别用hadoop3** 经过几天的奋战,开始用的hadoop3.2.0,hbase-2.2.0, Hmaster启动后几秒后被杀…

Python 数据分析三剑客之 Matplotlib(一):初识 Matplotlib 与其 matplotibrc 配置文件

CSDN 课程推荐:《Python 数据分析与挖掘》,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

【转】C++/CLI简介(什么是C++/CLI) -------C++/CLI 编程系列一

要知道C/CLI是什么,首先知道什么是CLI。 一、CLI简介 CLI:(Common Language Infrastructure,通用语言框架)提供了一套可执行代码和它所运行需要的虚拟执行环境的规范。更通俗的我们可以说它是一个虚拟平台,是操作系统和应用程序间的一层抽象…

hadoop分布式集群搭建,包含网络配置-hadoop3环境

先准备三台或者五台虚拟机(我这里写三台,实际我用的五台) 在安装centos时可以在选择(最小安装还是图形化界面处)有配置网络的,把网络先配置好,这样就不需要在重新配置了 先配置一台主机&#…

Python 数据分析三剑客之 Matplotlib(二):文本描述 / 中文支持 / 画布 / 网格等基本图像属性

CSDN 课程推荐:《Python 数据分析与挖掘》,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

【转】C++/CLI入门系列 第二篇:封装C++ dll库,提供接口给C#调用

看了第一篇感觉没啥用对吧,来点稍微有用的。 1、先建个c#工程,依次 file -> new -> project,选择 visula c# -> console application,写工程名,点 ok。 2、再建个c dll工程。依次 file -> add -> new …

Python 数据分析三剑客之 Matplotlib(三):图例 / LaTeX / 刻度 / 子图 / 补丁等基本图像属性

CSDN 课程推荐:《Python 数据分析与挖掘》,讲师刘顺祥,浙江工商大学统计学硕士,数据分析师,曾担任唯品会大数据部担任数据分析师一职,负责支付环节的数据分析业务。曾与联想、亨氏、网鱼网咖等企业合作多个…

zookeeper完全分布搭建-安装-配置

我这里是用的五台机器。 官网下载解压zookeeper,这里用的3.4.6 解压到/usr/local下 修改配置文件 1- 首先进入到zookeeper-3.4.6下的conf文件夹下 cd /usr/local/zookeeper/zookeeper-3.4.6/confls查看文件,然后拷贝zoo_sample.cfg并重命名为zoo.cf…