项目中静态和非静态常被用到,什么时候需要用静态的,什么时候需要使用非静态,以及他们的区别是什么?

一、概述

  静态和非静态的不同地方,就是静态从程序一启动就会一直占用内存,而非静态只有在实例化的时候才会分配内存,每实例化一次对象都会重新分配一次内存。比如数据库连接类,因为经常使用到,所以使用Static,定义成静态类是最合适的。如果定义成非静态方法,每次调用的时候都会实例化,这样占用内存就会非常大。再比如登录后台的方法,只在登陆的时候调用一次登录方法,定义成非静态方法是比较合适的。总之就是经常被调用的就用静态的,反之使用非静态。现在好多公司的项目都会使用静态,内存换时间也是一种方式。毕竟目前增加内存的方式也有很多方式,而且成本也可以接受,只希望程序处理时间缩短,增加用户体验。

二、静态类

  静态类和非静态类的重要区别在于静态类不能实例化,也就是说静态类不能通过new创建静态类型的实例。在声明一个类时使用static关键词有两方面的含义:防止程序员实例化该静态类,防止在静态类里面定义所有的实例字段和方法。 

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

  1、静态类的主要特征:

    (1)仅包括静态成员;

    (2)无法实例化;

    (3)静态类可以理解为是抽象密封类,无法被实例化和无法被继承;

    (4)不能包括实例构造函数;

  2、静态类的构造函数解析

    静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪个实例的,就是说这个构造函数只会执行一次。静态构造函数由.NET自动调用。

    (1)静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。

    (2).NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。

    (3)一个类只能有一个静态构造函数。

    (4)如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。

  3、静态类的生命周期生命周期

    当加载引用静态类的程序时,.NET Framework 公共语言运行时 (CLR) 将加载该静态类的类型信息,程序不能指定加载静态类的确切时间。但是,可以保证在程序中首次引用该类前加载该类,初始化该类的字段并调用其静态构造函数。 静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。也就是说,当页面第一次被访问的时候,相当于页面被构造,静态变量被静态构造器初始化,然后再次访问这个页面的时候,虽然非静态资源重新被构造,但是此时静态资源并不被重新构造并一直存在。

  

  1. public static class StaticStudent
  2. {
  3. private static string _name;
  4. private static int _age;
  5. static StaticStudent()
  6. {
  7. }
  8.  
  9. public static string Name
  10. {
  11. get { return _name; }
  12. set
  13. {
  14. _name = value;
  15. }
  16. }
  17.  
  18. public static int Age
  19. {
  20. get { return _age; }
  21. set
  22. {
  23. _age = value;
  24. }
  25. }
  26. }

三、静态成员

  1、静态成员的特性

  (1)静态成员只被创建一次,所以静态成员只有一份,实例成员有多少个对象,就有多少份。 

  

  (3)成员需要被共享的时候,方法需要被反复调用的时候,就可以把这些成员定义为静态成员。

  (4)在静态方法中,不能直接调用实例成员,因为静态方法被调用的时候,对象还有可能不存在。

  (5)this/base 关键字在静态方法中不能使用,因为有可能对象还不存在。

  (6)在实例方法中,可以调用静态成员,因为这个时候静态成员肯定存在。

  (7)非静态类可以包含静态的方法、字段、属性或事件;

  (8)一个非静态类既有静态成员也有实例成员,无论对一个类创建多少个实例,它的静态成员都只有一个副本;

  (9)静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例成员;

  (10)静态方法只能被重载,而不能被重写,因为静态方法不属于类的实例成员;

  (11)静态类不能够被继承,原因你可以理解为静态类被编译后其实就是抽象类和密封类,也可以这样理解:继承后 实例化对象的时候会先初始化基类构造函数 而基类没有非静态构造函数。

  (12)静态类不能实现接口。这时你会问我静态类被编译的结果是abstract和sealed类,接口是abstract类,这并没有影响到方法的实现啊。举个例子我们定义一个静态类,我们知道在一静态类中是不能定义实例化的成员的(比如实例化的方法)。一个类实现一个接口必须要用实例的方法来实现接口中的定义的契约,这个与上面的矛盾。

  (13)静态类不能被派生,原因是静态类只能从System.Object派生,派生继承是OO的,静态是反OO的。

  2、生命周期

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

  1. public class Student
  2. {
  3. private static string _name;
  4. private int _age;
  5. public Student(string name,int age)
  6. {
  7. this.Age = age;
  8. Name = name;
  9. }
  10.  
  11. public static string Name
  12. {
  13. get { return _name; }
  14. set
  15. {
  16. _name = value;
  17. }
  18. }
  19.  
  20. public int Age
  21. {
  22. get { return _age; }
  23. set
  24. {
  25. _age = value;
  26. }
  27. }
  28.  
  29. public static void StaticPrint()
  30. {
  31. Console.WriteLine("静态方法{0}",Name);
  32. }
  33. public void Print()
  34. {
  35. Console.WriteLine("非静态方法{0} {1}",Name,Age);
  36. }
  37. }

C#基础知识之静态和非静态的更多相关文章

  1. 20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)

    1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class ...

  2. 值类型与引用类型(特殊的string) Typeof和GetType() 静态和非静态使用 参数传递 相关知识

    学习大神博客链接: http://www.cnblogs.com/zhili/category/421637.html 一 值类型与引用类型 需要注意的string 是特殊类型的引用类型. 使用方法: ...

  3. C#基础--类/接口/成员修饰符,多态、重载、重写,静态和非静态

    C#基础--类/接口/成员修饰符,多态.重载.重写,静态和非静态 类/接口/成员修饰符 C#修饰符---接口: 接口默认访问符是internal接口的成员默认访问修饰符是public C#修饰符--类 ...

  4. .NET 基础 一步步 一幕幕[面向对象之静态、非静态]

    静态.非静态 先来看一段代码来区分静态与非静态: using System; using System.Collections.Generic; using System.Linq; using Sy ...

  5. c#基础3-方法的重载静态和非静态,字段属性,方法

    方法的重载概念:方法的重载指的就是方法的名称相同给,但是参数不同.参数不同,分为两种情况1).如果参数的个数相同,那么参数的类型就不能相同.2).如果参数的类型相同,那么参数的个数就不能相同.***方 ...

  6. Net基础篇_学习笔记_第十一天_面向对象(静态与非静态 static)

    static:静态的 静态和非静态的区别1).在非静态类中,既可以有实例成员(非静态成员),也可以有静态成员. 成员----方法/函数2).在调用实例成员的时候,需要使用对象名.实例成员;    在调 ...

  7. 初学者必看:.NET 中的静态与非静态的异同

    对于初学者来说,.NET 的静态和非静态一直比较难掌握,这里做一个总结,介绍静态类和普通类,静态方法和实例方法,静态构造函数和实例构造函数,静态字段和非静态字段的区别. 静态类 vs 普通类 静态类与 ...

  8. C# 面向对象3 静态和非静态的区别

    静态和非静态的区别 1.在非静态类中,既可以有实例成员(非静态成员),也可以有静态成员. 2.在调用实例成员的时候,需要使用对象名.实例成员; 在调用静态成员的时候,需要使用类名.静态成员名; 总结: ...

  9. 【Java】静态与非静态

    文章目录 静态与非静态 static关键字 使用static修饰属性:静态变量(或类变量) 类变量与实例变量的内存解析 使用static修饰方法:静态方法 使用static的注意点 开发中,如何确定一 ...

随机推荐

  1. npm 包的 发布 流程

    npm 包的发布流程 本文主要是针对 还未曾发布过自己的 npm 的同学,阐述一下 npm 的发布流程 熟悉的同学,可以绕道了. 首先你得有一个 自己的 npmjs.com 的账号 (没有的话,就到 ...

  2. SmartSql 性能评测

    BenchmarkDotNet=v0.10.14, OS=Windows 10.0.17134 Intel Core i7-6700K CPU 4.00GHz (Skylake), 1 CPU, 8 ...

  3. JDK源码分析(4)之 LinkedList 相关

    LinkedList的源码大致分三个部分,双向循环链表的实现.List的API和Deque的API. 一.定义 public class LinkedList<E> extends Abs ...

  4. Docker系列07—Dockerfile 详解

    本文收录在容器技术学习系列文章总目录 1.认识Dockerfile 1.1 镜像的生成途径 基于容器制作  dockerfile,docker build 基于容器制作镜像,已经在上篇Docker系列 ...

  5. 【Go】string 优化误区及建议

    原文链接: https://blog.thinkeridea.com/201902/go/string_ye_shi_yin_yong_lei_xing.html 本文原标题为 <string ...

  6. C#如何生成缩略图、水印

    1.安装CodeCarvings.Piczard   Install-Package CodeCarvings.Piczard 2.生成缩略图 ImageProcessingJob jobThumb ...

  7. Linux学习笔记之Django项目部署(CentOS)----进阶篇

    一.引入 当我们开发好了一个Django项目之后是需要部署到服务器上的,这样才能正式使用这个项目.之前用了一个运行.sh文件的方法让项目得以在后台运行,其实随着学习的深入,这种方法其实是有点low的, ...

  8. Android破解学习之路(八)—— 进化之地内购破解

    最近在TapTap闲逛,看到了进化之地这款游戏,TapTap上有两个进化之地,一个是在TapTap直接购买的,另外一个则是试玩版,玩到中间就会有个购买完整版. 试玩版连接:https://www.ta ...

  9. SpringMVC页面向Controller传参

    关于SpringMVC页面向Controller传参的问题,看了网上不少帖子,大多总结为以下几类: 1.直接把页面表单中相关元素的name属性对应的值作为Controller方法中的形参. 这个应该是 ...

  10. Ubuntu16.04 安装ROS及其IDE

    一. ROS的安装 1. 进入ROS官方网站 http://wiki.ros.org/ 2. Install -> ROS Kinetic Kame -> Ubuntu 3. 详情可参考所 ...