项目中静态和非静态常被用到,什么时候需要用静态的,什么时候需要使用非静态,以及他们的区别是什么?
一、概述
静态和非静态的不同地方,就是静态从程序一启动就会一直占用内存,而非静态只有在实例化的时候才会分配内存,每实例化一次对象都会重新分配一次内存。比如数据库连接类,因为经常使用到,所以使用Static,定义成静态类是最合适的。如果定义成非静态方法,每次调用的时候都会实例化,这样占用内存就会非常大。再比如登录后台的方法,只在登陆的时候调用一次登录方法,定义成非静态方法是比较合适的。总之就是经常被调用的就用静态的,反之使用非静态。现在好多公司的项目都会使用静态,内存换时间也是一种方式。毕竟目前增加内存的方式也有很多方式,而且成本也可以接受,只希望程序处理时间缩短,增加用户体验。
二、静态类
静态类和非静态类的重要区别在于静态类不能实例化,也就是说静态类不能通过new创建静态类型的实例。在声明一个类时使用static关键词有两方面的含义:防止程序员实例化该静态类,防止在静态类里面定义所有的实例字段和方法。
非静态类可以包含静态的方法、字段、属性或事件。即使没有创建类的实例,也可以调用该类中的静态成员。
1、静态类的主要特征:
(1)仅包括静态成员;
(2)无法实例化;
(3)静态类可以理解为是抽象密封类,无法被实例化和无法被继承;
(4)不能包括实例构造函数;
2、静态类的构造函数解析
静态构造函数是C#的一个新特性,其实好像很少用到。不过当我们想初始化一些静态变量的时候就需要用到它了。这个构造函数是属于类的,而不是属于哪个实例的,就是说这个构造函数只会执行一次。静态构造函数由.NET自动调用。
(1)静态构造函数既没有访问修饰符,也没有参数。因为是.NET调用的,所以像public和private等修饰符就没有意义了。
(2).NET将自动调用静态构造函数来初始化类,也就是说我们无法直接调用静态构造函数,也就无法控制什么时候执行静态构造函数了。
(3)一个类只能有一个静态构造函数。
(4)如果没有写静态构造函数,而类中包含带有初始值设定的静态成员,那么编译器会自动生成默认的静态构造函数。
3、静态类的生命周期生命周期
当加载引用静态类的程序时,.NET Framework 公共语言运行时 (CLR) 将加载该静态类的类型信息,程序不能指定加载静态类的确切时间。但是,可以保证在程序中首次引用该类前加载该类,初始化该类的字段并调用其静态构造函数。 静态构造函数仅调用一次,在程序驻留的应用程序域的生存期内,静态类一直保留在内存中。也就是说,当页面第一次被访问的时候,相当于页面被构造,静态变量被静态构造器初始化,然后再次访问这个页面的时候,虽然非静态资源重新被构造,但是此时静态资源并不被重新构造并一直存在。
public static class StaticStudent { private static string _name; private static int _age; static StaticStudent() { } public static string Name { get { return _name; } set { _name = value; } } public static int Age { get { return _age; } set { _age = value; } } }
三、静态成员
1、静态成员的特性
(1)静态成员只被创建一次,所以静态成员只有一份,实例成员有多少个对象,就有多少份。
(3)成员需要被共享的时候,方法需要被反复调用的时候,就可以把这些成员定义为静态成员。
(4)在静态方法中,不能直接调用实例成员,因为静态方法被调用的时候,对象还有可能不存在。
(5)this/base 关键字在静态方法中不能使用,因为有可能对象还不存在。
(6)在实例方法中,可以调用静态成员,因为这个时候静态成员肯定存在。
(7)非静态类可以包含静态的方法、字段、属性或事件;
(8)一个非静态类既有静态成员也有实例成员,无论对一个类创建多少个实例,它的静态成员都只有一个副本;
(9)静态方法和属性不能访问其包含类型中的非静态字段和事件,并且不能访问任何对象的实例成员;
(10)静态方法只能被重载,而不能被重写,因为静态方法不属于类的实例成员;
(11)静态类不能够被继承,原因你可以理解为静态类被编译后其实就是抽象类和密封类,也可以这样理解:继承后 实例化对象的时候会先初始化基类构造函数 而基类没有非静态构造函数。
(12)静态类不能实现接口。这时你会问我静态类被编译的结果是abstract和sealed类,接口是abstract类,这并没有影响到方法的实现啊。举个例子我们定义一个静态类,我们知道在一静态类中是不能定义实例化的成员的(比如实例化的方法)。一个类实现一个接口必须要用实例的方法来实现接口中的定义的契约,这个与上面的矛盾。
(13)静态类不能被派生,原因是静态类只能从System.Object派生,派生继承是OO的,静态是反OO的。
2、生命周期
静态成员在第一次被访问之前并且在调用静态构造函数(如有存在)之前进行初始化,此后一直保持在内存中,直到应用程序域的生命周期结束。
public class Student { private static string _name; private int _age; public Student(string name,int age) { this.Age = age; Name = name; } public static string Name { get { return _name; } set { _name = value; } } public int Age { get { return _age; } set { _age = value; } } public static void StaticPrint() { Console.WriteLine("静态方法{0}",Name); } public void Print() { Console.WriteLine("非静态方法{0} {1}",Name,Age); } }
C#基础知识之静态和非静态的更多相关文章
-
20151024_001_C#基础知识(静态与非静态的区别,值类型和引用类型,堆和栈的区别,字符串的不可变性,命名空间)
1:我们把这些具有相同属性和相同方法的对象进行进一步的封装,抽象出来类这个概念. 类就是个模子,确定了对象应该具有的属性和方法. 对象是根据类创建出来的. 2:类:语法 [public] class ...
-
值类型与引用类型(特殊的string) Typeof和GetType() 静态和非静态使用 参数传递 相关知识
学习大神博客链接: http://www.cnblogs.com/zhili/category/421637.html 一 值类型与引用类型 需要注意的string 是特殊类型的引用类型. 使用方法: ...
-
C#基础--类/接口/成员修饰符,多态、重载、重写,静态和非静态
C#基础--类/接口/成员修饰符,多态.重载.重写,静态和非静态 类/接口/成员修饰符 C#修饰符---接口: 接口默认访问符是internal接口的成员默认访问修饰符是public C#修饰符--类 ...
-
.NET 基础 一步步 一幕幕[面向对象之静态、非静态]
静态.非静态 先来看一段代码来区分静态与非静态: using System; using System.Collections.Generic; using System.Linq; using Sy ...
-
c#基础3-方法的重载静态和非静态,字段属性,方法
方法的重载概念:方法的重载指的就是方法的名称相同给,但是参数不同.参数不同,分为两种情况1).如果参数的个数相同,那么参数的类型就不能相同.2).如果参数的类型相同,那么参数的个数就不能相同.***方 ...
-
Net基础篇_学习笔记_第十一天_面向对象(静态与非静态 static)
static:静态的 静态和非静态的区别1).在非静态类中,既可以有实例成员(非静态成员),也可以有静态成员. 成员----方法/函数2).在调用实例成员的时候,需要使用对象名.实例成员; 在调 ...
-
初学者必看:.NET 中的静态与非静态的异同
对于初学者来说,.NET 的静态和非静态一直比较难掌握,这里做一个总结,介绍静态类和普通类,静态方法和实例方法,静态构造函数和实例构造函数,静态字段和非静态字段的区别. 静态类 vs 普通类 静态类与 ...
-
C# 面向对象3 静态和非静态的区别
静态和非静态的区别 1.在非静态类中,既可以有实例成员(非静态成员),也可以有静态成员. 2.在调用实例成员的时候,需要使用对象名.实例成员; 在调用静态成员的时候,需要使用类名.静态成员名; 总结: ...
-
C#基础之静态和非静态的区别
1.在非静态即可有非静态成员又可以有静态成员 2非静态调用创建类的对象.方法名,静态成员直接引用对象名
随机推荐
-
DEM数据如何生成高程点
这次给大家介绍一个arcgis里的实用功能:通过地形数据提取高程点. 首先做好准备工作: 1.地形数据下载获取 2.软件准备 locaspace viewer:http://rj.baidu.com/ ...
-
TCP/IP详解 笔记十四
TCP/IP协议(二) 连接的建立与终止 tcpdump -S输出TCP报文的格式 格式: 源>目的:标志 (标志就是tcp头部).标识首字符意义如下: 例如:telnet 某服务的输出(包括 ...
-
20145305 《Java程序设计》实验四
Android开发基础 安装过程没有截图 给出安装参考链接 http://ask.android-studio.org/?/article/9 实验结果截图: 完成HelloWorld项目,显示自己的 ...
-
Python实现正交实验法自动设计测试用例
1.简介 正交试验法是研究多因素.多水平的一种试验法,它是利用正交表来对试验进行设计,通过少数的试验替代全面试验,根据正交表的正交性从全面试验中挑选适量的.有代表性的点进行试验,这些有代表性的点具备了 ...
-
C#中Abstract和Virtual(转载)
在C#的学习中,容易混淆virtual方法和abstract方法的使用,现在来讨论一下二者的区别.二者都牵涉到在派生类中与override的配合使用. 一.Virtual方法(虚方法) virtual ...
-
题解——UVA11997 K Smallest Sums
题面 背景 输入 输出 翻译(渣自翻) 给定K个包含K个数字的表,要求将其能产生的\( k^{k} \)个值中最小的K个输出出来 题解 k路归并问题的经典问题 可以转化为二路归并问题求解 考虑A[], ...
-
Pandas笔记目录
速查笔记 使用实例 Pandas-数据导入 (未完成) Pandas-数据探索 基础属性 shape indexs columns values dtype/dtypes 汇总和计算描述统计 coun ...
-
Java IO--字节-字符流转换
OutputStreamWriter和InputStreamReader 一般在操作输入输出内容的就需要使用字节或字符流,但是有些时候需要将字符流变为字节流的形式,或者将字节流变为字符流的形式,所以, ...
-
Android——电脑蓝屏重启后,studio无法认出Android环境 setup JDK(缓存!缓存!缓存)
电脑蓝屏重启后,studio无法认出Android环境 setup JDK 问题重现:因为工作问题,需要用到模拟器,然后创建了模拟器后开启了漫长的等待之旅,两三分钟之后win8蓝屏,重启,再次打开,依 ...
-
[python01] python列表,元组对比Erlang的区别总结
数据结构是通过某种方式组织在一起的数据元素的集合,这些数据元素可以是数字,字符,甚至可以是其他的数据结构. python最基本的数据结构是sequence(序列):6种内建的序列:列表,元组,字符串, ...