在.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,这次按预想的输出了:
与类相比,类就不一样,类只要新建一个对象,其静态构造函数就一定会被调用,而不管里面有没有操作静态成员变量,有没有使用到。
可是另外还有一个问题是:结构是值类型,它的初始化分配一般如上的情况下是分配在栈中的,当某一个结构实例退出作用域时会自动出栈释放内存。
可是结构的静态字段呢?是如何分配的呢?如果是类,类的静态字段跟实例字段是完全不同的两个位置存储的,尽管都在堆中,但可以分配在堆中的不同区域,
难道栈也可以如此操作么?此处疑问保留!!!!!!