思维的乐趣

Enjoy it
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

.NET/C#中的结构中的静态成员及静态构造函数

Posted on 2010-10-05 01:29  szh114  阅读(1462)  评论(0编辑  收藏  举报

在.NET/C#中的结构这一数据类型中,

可以定义全局静态的成员变量,然后直接用结构名来引用,这一点跟类的用法并无差别,

但是在使用静态构造函数时要注意一个问题,以如下的代码为例:

 

1 using System;
2  using System.Collections.Generic;
3  using System.Linq;
4  using System.Text;
5
6  namespace TestProjectR
7 {
8 struct S1
9 {
10 public int i;
11 static S1()
12 {
13 Console.WriteLine("TEST!!!");
14 }
15 }
16
17 class Program
18 {
19 static void Main(string[] args)
20 {
21 S1 s = new S1();
22 s.i = 10;
23 Console.WriteLine(s.i);
24 }
25 }
26 }

实际的输出并不是:

 

 

TEST!!!

10

 

而是只有输出第二行,10,因为静态构造函数根本没有被调用。。。。。。

 

我想可能是因为结构中既没有静态成员变量,静态构造函数也没相关操作,所以没有被执行,因此改变示例如下:

 

 

1 using System;
2  using System.Collections.Generic;
3  using System.Linq;
4  using System.Text;
5
6 namespace TestProjectR
7 {
8 struct S1
9 {
10 public static int a;
11 public int i;
12 static S1()
13 {
14 a = 5;
15 Console.WriteLine("TEST!!!");
16 }
17 }
18
19 class Program
20 {
21 static void Main(string[] args)
22 {
23 S1 s = new S1();
24 s.i = 10;
25 Console.WriteLine(s.i);
26 }
27 }
28 }

 

结果输出仍然只有10,静态构造函数仍然没有被调用。

 

好,那可能是因为没有使用这个静态成员变量,因此静态构造函数没被调用,于是再次修改示例代码如下:

 

 

1 using System;
2 using System.Collections.Generic;
3 using System.Linq;
4 using System.Text;
5
6 namespace TestProjectR
7 {
8 struct S1
9 {
10 public static int a;
11 public int i;
12 static S1()
13 {
14 a = 5;
15 Console.WriteLine("TEST!!!");
16 }
17 }
18
19 class Program
20 {
21 static void Main(string[] args)
22 {
23 S1 s = new S1();
24 s.i = 10;
25 Console.WriteLine(s.i);
26 Console.WriteLine(S1.a);
27 }
28 }
29 }
30

OK,这次按预想的输出了:

 

 

与类相比,类就不一样,类只要新建一个对象,其静态构造函数就一定会被调用,而不管里面有没有操作静态成员变量,有没有使用到。

 

可是另外还有一个问题是:结构是值类型,它的初始化分配一般如上的情况下是分配在栈中的,当某一个结构实例退出作用域时会自动出栈释放内存。

 

可是结构的静态字段呢?是如何分配的呢?如果是类,类的静态字段跟实例字段是完全不同的两个位置存储的,尽管都在堆中,但可以分配在堆中的不同区域,

难道栈也可以如此操作么?此处疑问保留!!!!!!