您的位置:首页 > 编程语言 > C#

C# 静态类

2015-08-18 09:30 363 查看


C# 静态类

静态类是不能实例化的,我们直接使用它的属性与方法,静态类最大的特点就是共享。
探究
public static class StaticTestClass

{

public static int n = 0;

public static void Add()

{

n++;

}

}

网页 P1.aspx 调用 StaticTestClass.Add(),并在页面上输出 n。
网页 P2.aspx 调用 StaticTestClass.Add(),并在页面上输出 n。

访问者 V1 从客户端 C1 访问 P1.aspx,此时输出为 1。
访问者 V2 从客户端 C2 访问 P2.aspx,此时输出为 2。
访问者 V1 关闭浏览器,重新打开访问 P1.aspx,此时输出为 3。

只要 StaticTestClass 没有被重新编译,即使 P1.aspx、P2.aspx 被重新编译,每当调用 StaticTestClass.Add(),n 都会在前一个次的基础上加 1。
例2 public static class Class1

{ /// <summary>

/// 工号

/// </summary>

private static string _userNo = "";

public static string UserNo

{

get { return _userNo; }

set { _userNo = value; }

}

}

public partial class Form1 : Form

{

private void button1_Click(object sender, EventArgs e)

{ Class1.UserNo = textBox1.Text; }

private void button2_Click(object sender, EventArgs e)

{ MessageBox.Show(Class1.UserNo); }

private void button3_Click(object sender, EventArgs e)

{
Form2 frm2 = new Form2();

frm2.Show();

}

}

public partial class Form2 : Form

{

private void button1_Click(object sender, EventArgs e)

{ Class1.UserNo = textBox1.Text; }
private void button2_Click(object sender, EventArgs e)

{ MessageBox.Show(Class1.UserNo); }

}

form1 设userno=A1 ,from2 showuserno=A1;form2
设userno=A2 ,from1 showuserno=A2;
作用域是同一个进程。再起一个程序相互间不影响。
原则

静态类中的所有成员必须是静态的。

静态构造函数

静态类可以有静态构造函数,静态构造函数不可继承。
静态构造函数可以用于静态类,也可用于非静态类。
静态构造函数无访问修饰符、无参数,只有一个 static 标志。
静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。
如果一个类下面的所有成员,都需要被共享,那么可以把这个类定义为静态类
==================================================================

静态类主要是共享,静态类内部成员必须是静态的。

静态一般在程序加载的时候被构造。

我个人用静态类最多的地方的是程序配置部分,因为他的共享特性,在多个窗体中都需要调用,更主要的就是他在程序启动的时候就被初始化了。

静态类可以有构造函数,但是只被调用一次。

就上面说的程序配置数据部分,如果使用非静态类,那么你需要在任何有可能访问到他的代码前手动初始化他,并且还要将他赋给一个静态变量后才能使用。

费事不费事另说,假若你需要在他构造前某个位置来调用它,那还需要修改你构造他的代码的位置。

非静态类使用完成后系统会自动销毁释放,所以非静态类相对来说比较安全,而静态类是在程序结束后销毁的,在销毁前一直驻留在内存中,因此出现错误的可能性会大些。

建议不要过多的使用静态类,适时使用。

===================================================================================================


C# 静态类(static class)

分类: C#2012-02-21
09:29 2831人阅读 评论(0) 收藏 举报

classc#string语言.net

类可以声明为 static 的,以指示它仅包含静态成员。

静态类在加载包含该类的程序或命名空间时,由 .NET Framework 公共语言运行库 (CLR;特指:C#语言) 自动加载。

使用静态类来包含不与特定对象关联的方法,具有通用性

注意事项:

(1) 不能使用 new 关键字创建静态类的实例;

(2) 仅包含静态成员;

(3) 不能被实例化;

(4) 密封的,不能被继承;

(5) 不能包含实例构造函数,但可以包含静态构造函数;

关于静态构造函数的补充:

(1) 静态构造函数不可继承;

(2) 静态构造函数可以用于静态类,也可用于非静态类;

(3) 静态构造函数无访问修饰符、无参数,只有一个 static 标志;

(4) 静态构造函数不可被直接调用,当创建类实例或引用任何静态成员之前,静态构造函数被自动执行,并且只执行一次。

实例分析:

刚开始对静态类不太熟悉,所以写出了如下的代码:

[csharp] view
plaincopy

public class ClassA

{

public static string AppName = "hello, this is a static class test";

public static int num = 5;

public ClassA()

{

num = 15;

}

public static int getNum()

{

return num;

}

}

在主函数中调用ClassA的静态方法:

[csharp] view
plaincopy

static void Main(string[] args)

{

int num=ClassA.getNum();

Console.WriteLine(num);

Console.ReadLine();

}

最终的输出结果为:5

原因分析:

虽然有实例构造函数,但对classA类没有进行实例化,所以该实例构造函数没有被调用;

主函数代码修改如下:

[csharp] view
plaincopy

static void Main(string[] args)

{

ClassA a = new ClassA();

int num=ClassA.getNum();

Console.WriteLine(num);

Console.ReadLine();

}

输出结果为:15

如果类不声明为静态类(static class),很容易出现类似于上面的错误。修改为静态类,代码如下:

[csharp] view
plaincopy

public static class ClassA

{

public static string AppName = "hello, this is a static class test";

public static int num = 5;

static ClassA()

{

num = 15;

}

public static int getNum()

{

return num;

}

}

主函数代码如下:

[csharp] view
plaincopy

static void Main(string[] args)

{

int num=ClassA.getNum();

Console.WriteLine(num);

Console.ReadLine();

}

由于静态构造函数会在调用静态类的方法时自动调用,所以最终输出结果正确!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: