静态类与非静态类基本相同,但存在一个区别:静态类不能实例化。  也就是说,不能使用 new 关键字创建静态类类型的变量。  因为没有实例变量,所以要使用类名本身访问静态类的成员。  例如,如果名为 UtilityClass 的静态类有一个名为 MethodA 的公共方法,则按下面的示例所示调用该方法:

UtilityClass.MethodA();

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

double dub = -3.14;
Console.WriteLine(Math.Abs(dub));
Console.WriteLine(Math.Floor(dub));
Console.WriteLine(Math.Round(Math.Abs(dub)));  // Output:
// 3.14
// -4
// 3

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

若要创建仅允许创建一个自身实例的非静态类,请参见 Implementing Singleton in C#(在 C# 中实现单一实例)。

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

  • 仅包含静态成员。

  • 无法实例化。

  • 是密封的。

  • 不能包含实例构造函数。

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

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

示例

下面是一个静态类的示例,它包含两个在摄氏温度和华氏温度之间执行来回转换的方法:

 public static class TemperatureConverter{        public static double CelsiusToFahrenheit(string temperatureCelsius){            // Convert argument to double for calculations.double celsius = Double.Parse(temperatureCelsius);// Convert Celsius to Fahrenheit.double fahrenheit = (celsius * 9 / 5) + 32;            return fahrenheit;}        public static double FahrenheitToCelsius(string temperatureFahrenheit){            // Convert argument to double for calculations.double fahrenheit = Double.Parse(temperatureFahrenheit);            // Convert Fahrenheit to Celsius.double celsius = (fahrenheit - 32) * 5 / 9;            return celsius;}}    class TestTemperatureConverter{        static void Main(){Console.WriteLine("Please select the convertor direction");Console.WriteLine("1. From Celsius to Fahrenheit.");Console.WriteLine("2. From Fahrenheit to Celsius.");Console.Write(":");            string selection = Console.ReadLine();            double F, C = 0;            switch (selection){                case "1":Console.Write("Please enter the Celsius temperature: ");F = TemperatureConverter.CelsiusToFahrenheit(Console.ReadLine());Console.WriteLine("Temperature in Fahrenheit: {0:F2}", F);break;                case "2":Console.Write("Please enter the Fahrenheit temperature: ");C = TemperatureConverter.FahrenheitToCelsius(Console.ReadLine());Console.WriteLine("Temperature in Celsius: {0:F2}", C);break;              default:Console.WriteLine("Please select a convertor.");                   break;}            // Keep the console window open in debug mode.Console.WriteLine("Press any key to exit.");Console.ReadKey();}}    /* Example Output:Please select the convertor direction1. From Celsius to Fahrenheit.2. From Fahrenheit to Celsius.:2Please enter the Fahrenheit temperature: 20Temperature in Celsius: -6.67Press any key to exit.*/

静态成员

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

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

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

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

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

通过在成员的返回类型之前使用 static 关键字可以声明静态类成员,如下面的示例所示:

  public class Automobile{        public static int NumberOfWheels = 4;       public static int SizeOfGasTank{  get{   return 15;}}        public static void Drive() { }        public static event EventType RunOutOfGas;        // Other non-static fields and properties...}

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

     Automobile.Drive();            int i = Automobile.NumberOfWheels;

如果类包含静态字段,请提供在加载类时初始化这些字段的静态构造函数。

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

备注:转自https://msdn.microsoft.com/zh-cn/library/79b3xss3.aspx

转载于:https://blog.51cto.com/jiaojusuimu/1889171

C#学习基础--静态类和静态类成员相关推荐

  1. C++学习基础七——深复制与浅复制

    C++学习基础七--深复制与浅复制 一.深复制与浅复制基本知识 深复制和浅复制,又称为深拷贝和浅拷贝. 深复制和浅复制的区别如下图1所示: 图1 图1表示的是,定义一个类CDemo,包含int a和c ...

  2. 20165212 学习基础和C语言基础调查

    学习基础与C语言基础调查 阅读文章的心得体会 五篇文章都从不同角度阐述了毅力的重要性,打字.减肥.运动各方面,比如"每天一万步"这个任务,人们通过建群聊互相监督."打卡& ...

  3. ADODB 入门学习基础教程[多图]

    ADODB 入门学习基础教程[多图] 1. 前言 ADODB 是 Active Data Objects Data Base 的简称,它是一种 PHP 存取数据库的函式组件.现在 SFS3 系统 (校 ...

  4. 20165103学习基础和C语言基础调查

    20165103学习基础和C语言基础调查 学习基础和C语言基础调查 技能及其学习经验 在阅读老师做中学系列文章的时候,读到了一句话: 开发极点起因主要是个人兴趣爱好和工作需要. -- 引用自<做 ...

  5. Flutter学习-基础Widget

    Flutter学习-基础Widget 1. Flutter编程范式 1.1 编程范式的理解 1.2 flutter的编程范式 2. Text Widget 2.1 普通文本展示 2.2 富文本 2.3 ...

  6. Golang学习-基础命令

    链客,专为开发者而生,有问必答! 此文章来自区块链技术社区,未经允许拒绝转载. . Golang学习-基础命令 一.go run 用于运行命令源码文件,只能接收一个命令源码文件以及若干个库源码文件作为 ...

  7. 资源 | Intel发布AI免费系列课程3部曲:机器学习基础、深度学习基础以及TensorFlow基础

    翻译 | AI科技大本营(公众号ID:rgznai100) 校对 | 成龙 编辑 | 明明 Intel于近期发布了三门AI系列的免费课程,分别是关于机器学习基础.深度学习基础.TensorFlow基础 ...

  8. 深度估计相关原理(计算机视觉和深度学习基础)

    今天来和大家介绍一下深度估计涉及到的理论知识点,包括计算机视觉基础和深度学习基础. 一.计算机视觉基础 1.1. 针孔相机模型 相机模型,是指采用一个几何模型来描述三维世界中的坐标点映射到二维图像平面 ...

  9. 清华成果发布 | 广度学习基础计算系统集成平台

    来源:清华成果与知识产权 成果简介 随着国民经济的快速发展,机动车辆增长迅速.路面交通任务日益繁忙,国内交通安全形势面临日益严峻的考验.虽然基础应用系统已经达到了较高的技术和应用水平,但也存在着一些问 ...

  10. 深度学习基础(基本概念、优化算法、初始化、正则化等)

    2020-04-25 16:29:09 引言 深度学习目前已成为发展最快.最令人兴奋的机器学习领域之一,许多卓有建树的论文已经发表,而且已有很多高质量的开源深度学习框架可供使用.然而,论文通常非常简明 ...

最新文章

  1. ASP.NET 2.0 XML 系列(4):用XmlReader类介绍
  2. oracle数据库连接时报12514_Oracle 数据库 SQLPlus连接正常、PLSQL连接报错 ORA-12514、TNSPING正常...
  3. 国开计算机专业英语章节测试答案,国开大201x理工英语1第七单元网上测试答案...
  4. 推荐系统组队学习——WideDeep
  5. Scipy 基础 —— 稀疏矩阵
  6. c语言数字分解一个数,关于一道分解整数为N个连数整数的编程题
  7. mysql 5.5 innodb 优化_mysql 5.5 -- innodb buffer pool优化
  8. linux audit审计(7)--读懂audit日志
  9. UVa 10970 - Big Chocolate
  10. IT英语4-计算机英语缩写术语
  11. TCP中 滑动窗口RWND 和 拥塞窗口 CWND的区别
  12. 关于申请博客园开通博客功能
  13. 阿里云因发现Log4j2 核弹级漏洞,未及时上报,被工信部处罚。。
  14. 8. python基础之基础数据类型--bytes
  15. Linux 逻辑卷管理器(LVM)
  16. 流量卡官网源码 有后台带文章系统
  17. Java-集合当中进行模糊查找
  18. Vue实现离线创建项目
  19. Jeff Dean:机器学习在硬件设计中的潜力
  20. node-gyp 报错

热门文章

  1. 通用分页查询存储过程
  2. 面试时会经常遇到的经典算法
  3. SWF反编神器Action Script Viewer终身免费升级!
  4. Solaris 的防火墙ipfilter设置
  5. 诗与远方:无题(八十六)
  6. Python学习笔记之函数(五)
  7. Python学习笔记之if语句(二)
  8. 28. 对称的二叉树
  9. js代码优化(不定时更新)
  10. Eclipse使用TODO标签管理任务及自定义TODO标签