------- <a href" target="blank">Windows Phone 7手机开发</a>、<a href="" target="blank">.Net培训</a>、期待与您交流! ------
const的值是在编译期间确定的,因此只能在声明时通过常量表达式指定其值。而static readonly是在运行时计算出其值的,所以还可以通过静态构造函数来赋值。
要理解static,就必须要先理解另一个与之相对的关键字,很多人可能都还不知道有这个关键字,那就是auto,其实我们通常声明的不用static修饰的变量,都是auto的,因为它是默认的,就象short和long总是默认为int一样;我们通常声明一个变量:
int a;
string s;
其实就是:
auto int a;
auto string s;
而static变量的声明是:
static int a;
static string s;
这样似乎可以更有利于理解auto和static是一对成对的关键字吧,就像private,protected,public一样;
对于static的不理解,其实就是对于auto的不理解,因为它是更一般的;有的东西你天天在用,但未必就代表你真正了解它;auto的含义是由程序自动控制变量的生存周期,通常指的就是变量在进入其作用域的时候被分配,离开其作用域的时候被释放;而static就是不auto,变量在程序初始化时被分配,直到程序退出前才被释放;也就是static是按照程序的生命周期来分配释放变量的,而不是变量自己的生命周期
C#静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问;不带有 static 修饰符声明的变量称做非静态变量。static变量在对象被实例化时创建,通过对象进行访问一个类的所有实例的同一C#静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值。静态函数的实现里不能使用非静态成员,如非静态变量、非静态函数等。
例子1:
Code
#region//类A B中都含有static变量 构造函数
class A
{
public static int X;
static A()
{
X = B.Y + 1;
}
//static void Main()
//{
// Console.WriteLine("X={0},Y={1}", A.X, B.Y);//x=2,y=1
// Console.ReadLine();
//}
}
class B
{
public static int Y = A.X + 1;
static B() { }
static void Main()
{
Console.WriteLine("X={0},Y={1}", A.X, B.Y);//x=1,y=2
Console.ReadLine();
}
}
#endregion
解释:程序入库Main()位于类B中,因此类B首先进行初始化,次序为 int Y, 在对Y的赋值中使用到了类A,所以跳转到类A中,同样类A中的成员进行初始化,自域X开始这里为0,到静态构造函数X=B.Y+1,此时B.Y=0,所以X=1;然后->public static int Y = A.X + 1; ---》 得出Y=2.
例子2.
Code
#region//类Class1中既有 static变量和构造函数也有非 static的构造函数
class Class1
{
public static int count = 0;
static Class1()
{
count++;
}
public Class1()
{
count++;
}
}
#endregion
class Program
{
static void Main(string[] args)
{
Class1 c1 = new Class1();
Class1 c2 = new Class1();
Console.WriteLine(Class1.count);//Class1.count=3
Console.ReadLine();
}
}
解释:在 Class1 c1 = new Class1();实例化c1的时候,到Class1中实例化成员,次序是static变量,static构造函数,最后是非static构造函数;此时count=2;
在 Class1 c2 = new Class1(); 实例化c2时,因为static的变量,构造函数不再被执行,所以只执行非静态构造函数,所以这里count++一次;count=3.
C# static -静态方法与静态变量的用法
范例1:
using System;
namespace ConsoleApplication2
{
public class student
{
public int studentid;
public string name;
public static int count;
}
class Class1
{
static void Main(string[] args)
{
student mystudent=new student ();
mystudent.name="mary";
student.count ++;
student mystudent2=new student ();
mystudent2.name ="li ming";
student.count ++;
Console.WriteLine (student.count );
Console.WriteLine (mystudent.name );
Console.WriteLine (mystudent2.name );
}
}
}
个人总结:静态方法与静态变量要直接使用类名+静态成员名访问,非静态方法与静态变量要用类的实例+静态成员名来访问。
浙公网安备 33010602011771号