c#静态变量和非静态变量的区别
静态变量的类型说明符是static。静态变量当然是属于静态存储方式,但是属于静态存储方式的量不一定就是静态变量,例如外部变量虽属于静态存储方式,但不一定是静态变量,必须由 static加以定义后才能成为静态外部变量,或称静态全局变量。
详解:
一,静态资源在首次访问时会调用静态构造器创建类类型对象(静态属于类,动态属于对象,静态被静态构造器创建,动态被普通构造创建,所以实例对象的时候,静态不会被重新构造),
二,类型对象的生存周期是整个应用程序域的生存周期,也就说被访问过的静态资源,只有它所在的应用程序域被卸载时才会被卸载,静态变量始终存在着,也就是说它的生存期为整个源程序。
三,当页面第一次被访问的时候,相当于页面被构造,静态变量被静态构造器初始化,然后再次访问这个页面的时候,虽然非静态资源重新被构造,但是此时静态资源并不被重新构造并一直存在(也可以用来做页面状态保持,不过不建议用,因为一直占用资源,不像session还定时被回收),直至应用程序域被回收。(构造类静态若局部未赋以初值,则由系统自动赋以0值。 )
四,如果是application级的,用静态变量来代替application对象是可以的,优点是速度快(存储区域不同,而且不用装箱拆箱),缺点是没有application对象通用(application对象可以随意存储任何对象)
五,就是页面的静态变量页面第一次被访问时被初始化,在应用程序域一直保存,动态变量只在一个http请求作用(每次http请求相当于实例一次页面这个类)
六,静态变量在静态存储区内分配存储单元。在程序整个运行期间都不释放。而变量属于动态存储类别,存储在动态存储区空间(而不是静态存储区空间),函数调用结束后即释放。
七,由静态构造而联想到的问题:
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- namespace StaticDemo
- {
- class Program
- {
- static void Main(string[] args)
- {
- //创建包含静态构造函数的类实例时和访问包含静态构造函数的静态成员时,先调用静态构造函数,无论创建了多少个类实例和调用多少次静态成员,其静态构造函数都只调用了一次。
- StaticTest s = new StaticTest();
- StaticTest s2 = new StaticTest();
- //s.Say(); //无法使用实例来引用来访问静态成员
- StaticTest.Say();
- StaticTest.Say();
- Console.WriteLine(StaticTest.constdemo);
- //调用静态类的静态方法,其中的静态构造也是只被调用一次
- StaticTest2.Say();
- StaticTest2.Say();
- Console.ReadKey();
- }
- }
- public class StaticTest
- {
- //静态构造方法不可以被修饰符public等修饰,静态构造必须无参数
- //public static StaticTest()
- static StaticTest()
- {
- Console.WriteLine("非静态类的静态构造方法只被调用一次");
- }
- //无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
- public StaticTest() {
- Console.WriteLine("非静态类的非静态构造方法可以共存");
- }
- //虽然字段不能声明为 static const,但 const 字段的行为在本质上是静态的。
- //这样的字段属于类,不属于类的实例。因此,可以同对待静态字段一样使用 ClassName.MemberName 表示法来访问 const 字段
- public const int constdemo = ;
- public static void Say()
- {
- Console.WriteLine("非静态类的的静态方法");
- }
- }
- public static class StaticTest2
- {
- static StaticTest2()
- {
- Console.WriteLine("静态类的静态构造方法只被调用一次");
- }
- public static void Say()
- {
- Console.WriteLine("静态类的的静态方法");
- }
- }
- }
1》虽然字段不能声明为 static const,但 const 字段的行为在本质上是静态的。
2》静态构造方法不可以被修饰符public等修饰,静态构造必须无参数
3》创建包含静态构造函数的类实例时和访问包含静态构造函数的静态成员时,先调用静态构造函数,无论创建了多少个类实例和调用多少次静态成员,其静态构造函数都只调用了一次。
4》无参数的构造函数可以与静态构造函数共存。尽管参数列表相同,但一个属于类,一个属于实例,所以不会冲突。
八,那静态方法能不能被继承和重写?看如下代码,
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
- namespace StaticOrOverride
- {
- class Program
- {
- static void Main(string[] args)
- {
- ParentTest p = new ParentTest();
- ParentTest.Say(); //而静态方法能被父类继承使用
- }
- }
- public class Test
- {
- //public static virtual void Say() //错误:静态成员“StaticOrOverride.Test.Say()”不能标记为 override、virtual 或 abstract,也正是如此。静态成员不可以与被重写
- //{
- // Console.WriteLine("静态方法");
- //}
- public static void Say()
- {
- Console.WriteLine("静态方法");
- }
- }
- public class ParentTest : Test
- {
- }
- }
1》父类的静态方法可以被子类继承,但是不能重写,为什么呢?
重写的意思是重新定义父类的虚函数,但是虚函数是动态绑定的,而静态方法是静态绑定的,所以静态函数必然不能是虚函数,同时静态成员不能标记为 override、virtual 或 abstract,也就不存在所说的重写了.
九,动态绑定和静态绑定是什么意思呢?
1》动态绑定:只有在程序运行时才能决定调用哪个函数;
2》 静态绑定:编译时就可以决定调用哪个函数;
c#静态变量和非静态变量的区别的更多相关文章
- Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
//据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...
- java synchronized静态同步方法与非静态同步方法,同步语句块
摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...
- PHP静态成员变量和非静态成员变量
数据成员可以分静态变量.非静态变量两种. 静态成员: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会 ...
- 静态代码块&非静态代码块&构造函数
总结:静态代码块总是最先执行.非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行.父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态 ...
- 深度分析:Java 静态方法/变量,非静态方法/变量的区别,今天一并帮你解决!
静态/非静态 方法/变量的写法 大家应该都明白静态方法/字段比普通方法/字段的写法要多一个static关键字,简单写下他们的写法吧,了解的可以直接略过 class Test{ // 静态变量 publ ...
- java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序
java面试经常被问静态资源,非静态资源,父类子类,构造方法之间的执行顺序.下面添加两个类做个测试 class Parent { // 静态变量 public static String p_Stat ...
- Java静态同步方法和非静态同步方法
所有的非静态同步方法用的都是同一把锁——该实例对象本身.也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁进而执行 ...
- Java的外部类和内部类+静态变量和非静态变量的组合关系
看的李刚<疯狂java讲义>,里面讲内部类的地方感觉有点散而且不全,看完之后还是不十分清楚到底怎么用,于是自己写了个程序测试了一下.看如下代码,即可知道外部类和内部类+静态成员和非静态成员 ...
- Static静态变量和非静态变量
Static静态变量: 不同的对象共享这个变量的存储空间 而不是静态变量 每个对象具有可变的存储器空间 public class StaticDemo { private int count= ...
随机推荐
- 分页插件 Bootstrap Paginator
Bootstrap Paginator是一款基于Bootstrap的js分页插件,功能很丰富,个人觉得这款插件已经无可挑剔了.它提供了一系列的参数用来支持用户的定制,提供了公共的方法可随时获得插件状态 ...
- 阿里云centos下搭建vsftpd,被动模式出现的问题
最近计网课设要做一个ftp服务端,所以先在自己服务器搭一个来了解一下. 首先在默认情况下连接,227 Entering Passive Mode (192,168,*,*,227,175). 显示连接 ...
- Git--08 Jenkins
目录 Jenkins 01. 安装准备 02 .安装Jdk和Jenkins 03 .配置Jenkins 04. 插件安装 05. 创建项目 06. Jenkins获取Git源代码 07. 立即构建获取 ...
- [C++] 所有该类的对象共享静态类成员变量
问:智能指针可以对指针的引用数量进行计数,一个智能指针释放时,别的智能指针怎么知道的? 同一类的对象共享同一变量最简单的方法是静态变量: 不像普通的变量,静态成员变量是被所有类对象共享的,不同的对象可 ...
- Mystery——团队作业——系统设计
这个作业属于哪个课程 https://edu.cnblogs.com/campus/xnsy/SoftwareEngineeringClass1 这个作业要求在哪里 https://edu.cnblo ...
- Gene Ontology (GO) 注释
Gene Ontology (GO) 注释 Posted on 2017-06-11 | In 生信 相似的基因在不同物种中,其功能往往保守的.显然,需要一个统一的术语用于描述这些跨物种的同源基因 ...
- 前端-SuperSlide自动分页控制、自适应轮播图
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- selenium与appium怎样联系
appium是手机app端的自动化,它继承了webdriver(也就是selenium 2) 不过appium仍然需要通过selenium最后做测试工具,但是appium起到了一个连 ...
- Codeforces 803E--Roma and Poker (DP)
原题链接:http://codeforces.com/problemset/problem/803/E 题意:给一个n长度的字符串,其中'?'可以替换成'D'.'W'.'L'中的任意一种,'D'等价于 ...
- 如何在浏览器上安装 VueDevtools工具
火狐浏览器直接打开附加组件中,搜索 VueDevtools,找到安装即可. 谷歌浏览器--更多工具--扩展程序--打开下载好的VueDevtools整体拖进去就行了