C#基础知识之静态和非静态
项目中静态和非静态常被用到,什么时候需要用静态的,什么时候需要使用非静态,以及他们的区别是什么?
一、概述
静态和非静态的不同地方,就是静态从程序一启动就会一直占用内存,而非静态只有在实例化的时候才会分配内存,每实例化一次对象都会重新分配一次内存。比如数据库连接类,因为经常使用到,所以使用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.在调用实例成员的时候,需要使用对象名.实例成员; 在调用静态成员的时候,需要使用类名.静态成员名; 总结: ...
- 【Java】静态与非静态
文章目录 静态与非静态 static关键字 使用static修饰属性:静态变量(或类变量) 类变量与实例变量的内存解析 使用static修饰方法:静态方法 使用static的注意点 开发中,如何确定一 ...
随机推荐
- QWebView加载网页
开发环境:win10家庭中文版,vs2013,qt5.5.1 目的:使用webkit加载web页面代码如下: #include #include #ifdef _DEBUG#pragma commen ...
- 【c#】RabbitMQ学习文档(三)Publish/Subscribe(发布/订阅)
(本教程是使用Net客户端,也就是针对微软技术平台的) 在前一个教程中,我们创建了一个工作队列.工作队列背后的假设是每个任务会被交付给一个[工人].在这一部分我们将做一些完全不同的事情--我们将向多个 ...
- 写在最前面 - 《看懂每一行代码 - kubernetes》
我要写什么 <看懂每一行代码 - kubernetes>会包含k8s整个项目的源码解析,考虑到门槛问题,在开始分析k8s之前我会通过一些更低难度的golang开源项目讲解来帮助大家提升go ...
- 用户代码与Spring的交互形式,你有总结过吗?
PS:教科书般的文章太多了,我要追求与众不同,注意是追求.授人以鱼不如授人以渔. 相关文章 如何慢慢地快速成长起来? 你是如何看待Spring容器的,是这样子吗?
- [ SSH框架 ] Spring框架学习之一
一.Spring概述 1.1 什么是Spring Spring是一个开源框架, Spring是于2003年兴起的一个轻量级的Java开发框架,由 Rod Johnson在其著作 Expert One- ...
- 对配置文件 xml 进行操作
个人喜欢用 Linq 的方式来进行操作,方便快捷 <?xml version="1.0" encoding="utf-8" ?> <confi ...
- C# Quartz定时任务corn时间设置详解
http://cron.qqe2.com/ 如果不会 或者想检验自己是否写的对就 通过这个网站 检测 或自动生成 * * * * * * ...
- PHP中的__get和__set理解
先来了解一下PHP类中的__get和__set函数 当我们试图获取一个不可达属性时(比如private),类会自动调用__get函数.当试图设置一个不可达属性时(比如private),类会自动调用__ ...
- C# 在PDF中绘制动态图章
我们知道,动态图章,因图章中的时间.日期可以动态的生成,因而具有较强的时效性.在本篇文章中将介绍通过C#编程在PDF中绘制动态图章的方法,该方法可自动获取当前系统登录用户名.日期及时间信息并生成图章. ...
- 【转】Android开发笔记(序)写在前面的目录
原文:http://blog.csdn.net/aqi00/article/details/50012511 知识点分类 一方面写写自己走过的弯路掉进去的坑,避免以后再犯:另一方面希望通过分享自己的经 ...