c# 静态成员(静态字段,属性,方法,构造器,类) .
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
一、静态字段
@1、与实例字段一样,可以在声明的同时进行初始化。
@2、与实例字段不同,如果没有对静态字段进行初始化,静态字段将自动获取默认值(0,null,false等)。所以,一个静态字段即使没有被显示地赋值,也可以被访问。
二、静态属性
三、静态方法
@1、this关键字在静态方法中是无效的。因为静态方法不是通过一个特定的实例来引用的。
@2、一般静态方法不能访问类中的实例字段和实例方法,除非事先获得对字段和方法所从属于的那个特定的实例的引用(通过传递参数)。
四、静态构造器
静态构造器用来对类而不是类实例进行初始化。静态构造器并不是显示调用的。”运行时“会在首次访问类(可能是调用一个普通构造器,可能是访问类的一个静态方法或静态字段)时自动调用静态构造器。
我们使用静态构造器将类中的静态数据初始化成一个特定的值,尤其是在无法通过在声明时的一次简单地赋值来获得初始值的时候。
例如: class Employee
{ static Employee()
{ Random randomGenerator=new Randow();
NextId=randomGenerator.Next(101,999);//生成一个100到1000的一个随机整数
}
public static int NextId=42;
}
说明:由于初始值涉及一个方法调用,无法通过在声明时的一次简单地赋值来完成。所以NextId的初始化代码被放到一个静态构造器中,而没有作为声明的一部分。
注意:@1、假如对NextId的赋值既在静态构造器中进行,又在声明时进行,那么当初始化结束的时候,最终获得的是什么值?观察C#编译器生成的CIL代码,发现声明时的赋值被移动了位置,成为静态构造器中的一个语句。因此,在静态构造器中进行的赋值将优先于声明字段时进行的赋值,这会实例字段的情况是一样的。
@2、没有静态终结器的说法。
@3、最好是在声明的同时完成静态初始化,而不要使用静态构造器。
五、静态类
@1、静态类不包含任何实例字段 ,实例方法。当创建一个能实例化的类没有意义是,就可以声明为静态类。
@2、c#编译器会自动在CIL代码中把静态类标记为abstract何sealed。这会将类指定为不可扩展即不能从他派生出其他类。
静态变量使用 static 修饰符进行声明,在类被实例化时创建,通过类进行访问不带有 static 修饰符声明的变量称做非静态变量。
static变量在对象被实例化时创建,通过对象进行访问一个类的所有实例的同一C#静态变量都是同一个值,同一个类的不同实例的同一非静态变量可以是不同的值。
静态函数的实现里不能使用非静态成员,如非静态变量、非静态函
数等。
class StaticTest
{
static int x = 0;
int y = 0;
public void SetX(int a)
{
x = a;
}
public void SetY(int a)
{
y = a;
}
public void Print()
{
Console.WriteLine("x = {0} y = {1}", x, y);
}
static void Main(string[] args)
{
StaticTest st = new StaticTest();
StaticTest st1 = new StaticTest();
st.SetX(10); //将10赋给x;
st.SetY(10); //将10赋给y;
st.Print(); //显示:x=10 y=10
st1.SetX(20); //将20赋给x
st1.SetY(20); //将20赋给x
st1.Print(); //显示:x=20 y=20
st.Print(); //由于x是静态变量,所以在此调用第一次初始化实例st时,静态变量已经变为20, 输出:x=20 y=10
st.SetX(30);
st.SetY(30);
st.Print(); //由于x是静态变量,所以在此调用初始化实例st时,静态变量已经变为30, 输出:x=30 y=30
st1.Print(); //由于x是静态变量,所以在此调用st1实例时,静态变量已经变为30, 输出:x=30 y=20
}
}
静态类:
声明为static,它仅包含静态成员,不能用new静态类的实例。使用静态类来包含不与特定对象关联的方法。
功能:仅包含静态成员,不能被实例化,是密封的,不能包含实例构造函数,可包含静态构造函数以分配初始值或设置某个静态变量。
优点:编译器能够执行检查以确保不致偶然地添加势力成员。编译器将保证不会创建此类的实例。
静态方法:
是一种特殊的成员方法,不属于类的某一个具体的实例。非静态方法可以访问类中的任何成员,而静态只能访问类中的静态成员。
静态构造函数:
用于对静态字段、只读字段等的初始化。
添加static关键字,不能添加访问修饰符,因为静态构造函数都是私有的。
类的静态构造函数在给定应用程序域中至多执行一次:只有创建类的实例或者引用类的任何静态成员才激发静态构造函数
静态构造函数是不可继承的,而且不能被直接调用。
如果类中包含用来开始执行的 Main 方法,则该类的静态构造函数将在调用 Main 方法之前执行。任何带有初始值设定项的静态字段,则在执行该类的静态构造函数时,先要按照文本顺序执行那些初始值设定项。
如果没有编写静态构造函数,而这时类中包含带有初始值设定的静态字段,那么编译器会自动生成默认的静态构造函数。
C#静态方法及
属性在程序启动的时候,就全部装入内存的,而不管这些方法、属性以后有没有用到。即使是没有人再访问程序,这部分内存仍然不会释放还有就是,所有访问者看到的静态属性的数据几乎都是一样的,比如A用户设置了UserName这个属性,B用户访问的时候,得到的UserName仍然是A用户设置的那个。这种特性,如果用在固定数据中,那不会有太大问题,比如连接字符串之类的
C#静态方法/数据成员是属于类的,不是属于某一个对象的,因而调用它不需要实例化;静态方法和静态数据成员相当于共享变量。为该类的所有对象所共有,因而在需要共享数据时,定义这种类型时很好的选择。 一但定义一个类后(不一定要实例化对象)该类的所有静态成员就载入内存(并不是程序启动,就装入内存,没有定义该类时它不会载入内存) 静态成员的作用域与它所属的类的作用域相同