C#静态变量 总结
在C#程序中,没有全局变量的概念,这意味着所有的成员变量只有该类的实例才能操作这些数据,这起到了“信息隐藏”的作用。但有些时候,这样做却不是个明智的选择。
假设我们要定义一个图书类,要求该类能保存图书的数量,即每增加一本图书(定义一个实例),图书的数量应该加1。如果没有静态变量,我们需要将图书的数量保存在每本图书(实例)里,然而,这样的变量要在不同图书(实例)里重复存储,图书(实例)数量少的话,我们还能接受,如果图书(实例)数量较多的话,比如成千上万,我们无法想象这要造成多少资源(如内存、磁盘空间)的浪费,更让人无法忍受的是:因为图书(实例)的数量要保存在每本图书(实例)里,该值肯定是不同的。要使这些图书(实例)中保存的图书(实例)数量一致,我们必须在每增加一本新书(生成一个新实例)时,修改其他所有图书(实例)中保存的该值。Oh,My God!你会重新向往面向过程的程序设计方法,向往拥有全局变量的时代。但,这种局面不会出现,因为C#中为你准备好了另外一种变量类型:静态变量。它在类中类似全局变量,保存类的公共信息,所有该类的实例(对象)共享该值。
声明静态变量的语法如下:
<访问修饰符>static 数据类型 变量名;
这里的访问修饰符跟类的其它成员一样,可以是public,protected,private或internal等。
在普通的成员变量前加static关键字,就变成了静态变量。静态变量和实例变量存储方式不同,静态变量在声明开始,就一直存储在内存中,直到整个程序终止。而实例成员在创建对象时分配内存,并存储一个数据副本。所以静态成员变量认为是属于类的,而不是对象。
静态变量与实例变量的区别如下:
1.内存分配
静态变量在应用程序初始化时,就存在于内存当中,直到它所在的类的程序运行结束时才消亡;
而实例变量需要被实例化后才会分配内存。
2.生存周期
静态变量生存周期为应用程序的存在周期;
实例变量的存在周期取决于实例化的类的存在周期。
3.调用方式
静态变量只能通过“类.静态变量名”调用,类的实例不能调用;
实例变量当该变量所在的类被实例化后,可通过实例化的类名直接访问。
4.共享方式
静态变量是全局变量,被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值;
实例变量是局部变量,不共享的。
5.访问方式
静态成员不能访问实例成员;
实例成员可以访问静态成员。
静态变量在类装载的时候分配内存,以后创建的对象都使用的该内存,相应的操作也就是对这块内存进行操作。也可以看作是另类的全局变量。
所以:静态变量只的值只会初始化一次,后面每次访问,都是上次处理过的值,(即使是在一个函数内部)。 实例变量每次都初始化。
using System;
class Program
{
static void Main(string[]args)
{
//输出未经定义的静态变量,结果为0;也说明了,在C#中未赋初值的变量系统自动赋为0
Console.WriteLine(sort.i);
//静态变量的访问方法(类名.静态变量名),而且还可以在外部操作静态变量呢,可见静态变量并不神秘;
sort.i = 5;
//输出5
Console.WriteLine(sort.i);
//还可以通过构造函数对静态变量赋初值呢,呵呵
sort sortTest = new sort();
//输出构造函数中的赋值 3;
Console.WriteLine(sort.i);
}
}
class sort
{
public static int i;
public sort()
{
i = 3;
}
}
静态变量必须使用类名来引用,而不能使用类的实例,因为,静态变量不属于任何实例,而是共有的。我们可以打个比方:在一个班级中,有些物品是个人的,我们想使用时,必须指出物品的所有者,比如说“王三的自行车”,在C#程序中我们可以使用:王三.自行车的格式。有些物品是大家共有的物品,不能以个人名义使用,而是用班级的名义使用,比如班集体出资买的篮球,只能说:“班级的篮球”,而不能说:“王三的篮球”。这绝对是不行的,这对其他人绝对是不公平的,我们可以联想到许多贪官污吏就是使用了不属于自己的东西,或以个人名义使用公家的东西而葬送了自己。
说一句有用的就是:静态变量是用类名来引用它。即:类名.静态变量名;
举个具体的例子如下:
using System;
using System.Collections.Generic;
using System.Text;
class Program
{
class Class1
{
public static String staticStr = "Class";
public String notstaticStr = "Obj";
}
static void Main(string[]args)
{
//静态变量通过类进行访问,该类所有实例的同一静态变量都是同一个值
Console.WriteLine("Class1's staticStr: {0}", Class1.staticStr);
Class1 tmpObj1 = new Class1();
tmpObj1.notstaticStr = "tmpObj1";
Class1 tmpObj2 = new Class1();
tmpObj2.notstaticStr = "tmpObj2";
//非静态变量通过对象进行访问,不同对象的同一非静态变量可以有不同的值
Console.WriteLine("tmpObj1's notstaticStr: {0}", tmpObj1.notstaticStr);
Console.WriteLine("tmpObj2's notstaticStr: {0}", tmpObj2.notstaticStr);
Console.ReadLine();
}
}
C#静态变量 总结的更多相关文章
- PHP 面向对象编程和设计模式 (2/5) - 静态变量、属性和方法及延迟绑定
PHP高级程序设计 学习笔记 2014.06.10 Static(静态)关键字用来定义静态方法和属性,static 也可用于定义静态变量以及后期静态绑定. 1.静态变量 static variable ...
- [转]Android静态变量的生命周期
原文地址:https://my.oschina.net/jerikc/blog/137207 Android是用Java开发,其静态变量的生命周期遵守Java的设计.我们知道静态变量是在类被load的 ...
- QT,静态变量要记得初始化
//DbUtil.h #ifndef DBUTIL_H #define DBUTIL_H using namespace std; QString md5Encode(QString passwd); ...
- .NET静态变量与静态方法并发的问题
我们知道,静态变量与静态方法都是在程序编译的时候就定义好了的,并且不会存在多个副本.所以对于静态变量来说,一旦修改了就会影响全局. 因此,静态变量是存在并发性问题的,所以当我们在操作静态变量的时候需要 ...
- JAVA的静态变量、静态方法、静态类
静态变量和静态方法都属于静态对象,它与非静态对象的差别需要做个说明. (1)Java静态对象和非静态对象有什么区别? 比对如下: 静态对象 ...
- 关于C#静态变量初始化问题
关于这个静态变量,平时自己没有太认真的去认识.最近调项目的bug,让我重新认识了静态变量的特点. 其实,我们一直都在说:静态变量只在类第一次初始化的时候进行初始化,以后都不初始化. 很简单的一句话,但 ...
- android 尽量不要使用static静态变量
使用静态static静态变量潜在性问题: 1.占用内存,并且内存一般不会释放: 2.在系统不够内存情况下会自动回收静态内存,这样就会引起访问全局静态错误. 3.不能将activity作为static静 ...
- Java代码执行顺序(静态变量,非静态变量,静态代码块,代码块,构造函数)加载顺序
//据说这是一道阿里巴巴面试题,先以这道题为例分析下 public class Text { public static int k = 0; public static Text t1 = new ...
- Java---类加载机制,构造方法,静态变量,(静态)代码块,父类,变量加载顺序
直接上代码: 代码1: public class ConstroctTest { private static ConstroctTest test = new ConstroctTest(); // ...
- PHP之static静态变量详解(一)
什么是static静态变量?(以下为在C语言中的理解) 静态变量 类型说明符是static. 静态变量属于静态存储方式,其存储空间为内存中的静态数据区(在静态存储区内分配存储单元),该 区域中的数据在 ...
随机推荐
- PyCharm 格式化代码 常用快捷键
ctrl+alt+L 一 常用快捷键 编辑类:Ctrl + D 复制选定的区域或行Ctrl + Y 删除选定的行Ctrl + Alt + L 代码格 ...
- import xxx和from xxx import xx中修改被导入模块里面的变量的坑
现在有如下几个模块: A.py 功能:定义全局变量,供其他模块使用 name = "张三" lists = [1, 2, 3, 4, 5] B.py 功能:打印A.py中的变量 f ...
- python基础知识0-4
collection 他是对字典 元组 集合 进行加工的 是计数器 无论 深 ,浅 ,赋值 拷贝 内存地址都不变 赋值也是拷贝的一种 拷贝分两类数字 字符串 另一类: 列表 字典 元组 这一类还分两 ...
- jenkins转换显示语言为中文简体(jenkins汉化)
jenkins版本2.117 单位使用的jenkins一直是英文版本,有同事建议切换为中文版. 以下过程完成转换. 一.安装插件 主界面-->系统管理-->插件管理-->可选插件 图 ...
- 20-Perl 正则表达式
1.Perl 正则表达式正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来检查一个串是否含有某种子串.将匹配的子串做替换或者从某个串中取出符合某个条件的子串等.Pe ...
- linux查询cpu过高原因--java
1. 查询java pid top -c 2. 查询java进程下,线程情况 top -Hp pid(threadIdList) 3. 将10进制线程id转为16进制 printf "%x ...
- C#实现鼠标滚筒缩放界面的效果
elementCanvas继承UserControl 声明属性: #region 缩放属性添加 float ratio = 1.0f; public float Ratio { set { ratio ...
- mqtt协议实现 java服务端推送功能(三)项目中给多个用户推送功能
接着上一篇说,上一篇的TOPIC是写死的,然而在实际项目中要给不同用户 也就是不同的topic进行推送 所以要写活 package com.fh.controller.information.push ...
- 10 Django之Ajax请求
一.什么是Ajax技术? 异步的JavaScript和XML.使用Javascript语言与服务器进行异步交互,传输的数据为XML(更多的使用json数据).Ajax不是一门新的编程语言,而是一种使用 ...
- 微信小程序下拉刷新
<config> { enablePullDownRefresh: true, navigationBarTitleText: "消息中心", } </confi ...