静态变量和非静态变量
在c里面都是静态的.
在c#里对于类里面的任何非静态成员,要用就必须有对象应用。
class A
{
static int a;
int b;
}
main
{
int i = 0;
A classA = new A();
//要用b就必须写成
classA.b = i;
//要用a就必须写成
A.a = i;
//看出来没有,classA是对象,而A是类;
}
理论部分:
一.静态变量和非静态变量的基本概念
数据成员包括:静态变量和非静态变量两种
A 静态变量:带有static 修饰符的变量称为静态变量。
B 非表态变量:不带有static修饰符声明的变量称为实例变量。
二. 两都的一些区别
class test
{
static int b=0; //静态变量
int a=0; //非静态变量
}
1.内存分配的区别:静态变量定义时就会存在于内存当中,直到它所在的类的程序运行结束之时它都将一直存在;而非静态变量需要被实例化后才会分配内存,它的存在周期取决于实例化的类的生存周期。
所以他们的调用方式也不相同:
静态变量:可以(只能)通过类本身.静态变量名,类的实例是不能调用的。
非静态变量: 当该变量所在的类被实例化后,可以通过实例化的类名来访问。
(另外静态成员不能访问非静态成员;非静态成员可以访问静态成员)
test.b=2; //OK
test t=new test();
t.a=0; //OK
t.b=3 ; //Error 编绎时会出错 无法使用实例引用访问静态成员
2. 两者值的共享问题: 静态变量被所有类的实例对象共享,即一个实例的改变了静态变量的值,其他同类的实例读到的就是变化后的值。非静态变量是不共享的。
ex:下面的最后的输出结果是:10,0
class Class1
{
public static int cs1=0;
public int cs3=0;
}
class Class2
{
public void a()
{
Console.WriteLine(Class1.cs1.ToString());
// 因cs1是静态变量,所以当类Program修改cs1=10后,其它类的实例读到的值就是修改后的值10,所以此处输出的是:10
Class1 cc = new Class1();
Console.WriteLine(cc.cs3.ToString());
//虽然类Program修改值cs3=34;但因cs3在class1类中是非静态变量,它的生存周期于实例化他的类的周期相同,所以当用类名ct实例结束后其值也不会存在于内存当中,当此类用另一个类名cc来实例化后调用变量cs3,其值仍是非静态变量初始化的值0.
}
}
class Program
{
static void Main(string[] args)
{
Class1.cs1 = 10;
Class1 ct = new Class1();
ct.cs3 = 34;
Class2 cm = new Class2();
cm.a();
}
}
类名.静态变量名
实例化的名.非静态变量名