问题描述
- 关于静态变量初始化为当前类型的对象问题
-
public class test
{
int c = 0;
public static test my = new test(2);
public int X;
public test(int x)
{
X = x;
}
}
class Program
{
static void Main(string[] args)
{
test me = test.my;
Console.WriteLine(me.X.ToString () );
Console.ReadKey();
}
}在内存中,静态变量什么时候调用的构造方法啊?为什么自己能调用自己?
解决方案
my不是静态变量,它只是在类内部实例化的一个对象
类有三种构造函数
1.静态构造函数 static test() 这类构造函数只能对类的静态变量进行初始化
2.实例构造函数 public test() 只要有实例化过程,就会调用这个构造函数
3.静态构造函数 private test() 一般用于只包含私有成员的类的初始化
解决方案二:
在第一次调用 test.my 的时候初始化。
什么叫做“自己能调用自己”?test(2) 是构造函数好吗。
解决方案三:
public static test my = new test(2);
其实这段代码是放在test的静态构造函数中执行。
静态构造函数和实例构造函数不矛盾。
比如说,一些水平很烂的老师经常会指导学生写如下的程序
class Program
{
int add(int a, int b)
{
return a + b;
}
public static void main()
{
Program p = new Program();
p.add(1, 2);
}
}
这完全可以。为什么说老师很烂,因为这种场合应该把add也定义成static变量才是正确的做法。
解决方案四:
static的东西在类加载时,就分配了内存空间,即编译时就为这些成员变量的实例分配了空间。
解决方案五:
C++的妈妈是C,故不论怎么变都会生成C代码,有些事情是编译器帮你做了,
解决方案六:
类中的静态变量是在编译的时候就分配了内存的,而且不管你的实例对象有多少它都只有1份