静态变量的类型说明符是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#静态变量和非静态变量的区别的更多相关文章

  1. Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序

    //据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...

  2. java synchronized静态同步方法与非静态同步方法,同步语句块

    摘自:http://topmanopensource.iteye.com/blog/1738178 进行多线程编程,同步控制是非常重要的,而同步控制就涉及到了锁. 对代码进行同步控制我们可以选择同步方 ...

  3. PHP静态成员变量和非静态成员变量

    数据成员可以分静态变量.非静态变量两种. 静态成员: 静态类中的成员加入static修饰符,即是静态成员.可以直接使用类名+静态成员名访问此静态成员,因为静态成员存在于内存,非静态成员需要实例化才会 ...

  4. 静态代码块&非静态代码块&构造函数

    总结:静态代码块总是最先执行.非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行.父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非静态 ...

  5. 深度分析:Java 静态方法/变量,非静态方法/变量的区别,今天一并帮你解决!

    静态/非静态 方法/变量的写法 大家应该都明白静态方法/字段比普通方法/字段的写法要多一个static关键字,简单写下他们的写法吧,了解的可以直接略过 class Test{ // 静态变量 publ ...

  6. java 静态资源,非静态资源,父类子类,构造方法之间的初始化循序

    java面试经常被问静态资源,非静态资源,父类子类,构造方法之间的执行顺序.下面添加两个类做个测试 class Parent { // 静态变量 public static String p_Stat ...

  7. Java静态同步方法和非静态同步方法

             所有的非静态同步方法用的都是同一把锁——该实例对象本身.也就是说如果一个实例对象的非静态同步方法获取锁后,该实例对象的其他非静态同步方法必须等待获取锁的方法释放锁后才能获取锁进而执行 ...

  8. Java的外部类和内部类+静态变量和非静态变量的组合关系

    看的李刚<疯狂java讲义>,里面讲内部类的地方感觉有点散而且不全,看完之后还是不十分清楚到底怎么用,于是自己写了个程序测试了一下.看如下代码,即可知道外部类和内部类+静态成员和非静态成员 ...

  9. Static静态变量和非静态变量

    Static静态变量:   不同的对象共享这个变量的存储空间 而不是静态变量   每个对象具有可变的存储器空间 public class StaticDemo { private int count= ...

随机推荐

  1. Vue小白篇 - Vue介绍

    Vue ?啥是Vue?能干嘛? vue 的介绍 Vue 是一套用于构建用户界面的 渐进式框架 ,与其它大型框架不同的是, Vue 被设计为可以自底向上逐层应用.Vue 的核心库只关注视图层 前端三大框 ...

  2. Kvm04 kvm虚拟机热迁移,可视化管理

    目录 1.kvm虚拟机热迁移 1). 冷迁移 修改配置文件,将定义的格式raw,改成qcow2格式! 修改完成,重启服务 2).热迁移 2.Virt-manager管理Kvm虚拟机 1.kvm虚拟机热 ...

  3. Sass--传多个参数

    Sass 混合宏除了能传一个参数之外,还可以传多个参数,如: @mixin center($width, $height) { width: $width; height: $height; posi ...

  4. win10搭建ftp环境

    1.进入程序,并点击“启用或关闭windows功能” 2.勾选对应的功能,并点击“确定” 3.进入IIS 4.如下图 5.如图 6.如图 7.如下图 8.创建新用户,用于登录ftp(自行创建) 9.禁 ...

  5. CentOS下安装gdb的方法

    https://blog.csdn.net/zlk252620068/article/details/79564944

  6. bzoj1488 [HNOI2009]图的同构 Burnside 引理

    题目传送门 bzoj1488 - [HNOI2009]图的同构 bzoj1815 - [Shoi2006]color 有色图(双倍经验) 题解 暴力 由于在做题之前已经被告知是 Burnside 引理 ...

  7. django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 or newer is required; you have 0.7.11

    搭建Django2.0+Python3+MySQL5时同步数据库时报错:django.core.exceptions.ImproperlyConfigured: mysqlclient 1.3.3 o ...

  8. python每日练习10题2

    163.一个字典 key 是人名.value 是年龄,找出其中年龄 最大的人 d = {"张三":25,"李四":30,"王五":80,&q ...

  9. Python基础教程(019)--执行Python的方式,IPython

    前言 了解IPython 内容 IPython 是一个Python的交互式shell,比默认的Python shell 好用的多 查看图片 在提示符下执行 目的 了解进入IPython 退出IPyth ...

  10. flutter网格布局之GridView组件

    前面总结了使用ListView来实现列表,但是,有的时候,数据量很大,需要使用矩阵方式排列才能更清晰的展示数据,在flutter中,可以使用网格列表组件GridView来实现这个布局. GridVie ...