怎么我输出来的是x=2,y=1呢
我自己的理解是:
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
运行顺序如下:
构造A,x=0 -> A的构造函数中调用了B -> 构造B,y=1 -> 返回至A的构造函数中的X=B.y+1=2
因此,输出的是X=2,Y=1
我自己的理解是:
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
运行顺序如下:
构造A,x=0 -> A的构造函数中调用了B -> 构造B,y=1 -> 返回至A的构造函数中的X=B.y+1=2
因此,输出的是X=2,Y=1
/**//**************************************************
* 静 态 构 造 函 数 练 习
* (1)①②③……为执行顺序
* (2)输出结果: static A()
* static B()
* X = 1, Y = 2
***************************************************/
using System;
class A
{
public static int X;
static A() //④ 执行完后返回到③
{
Console.WriteLine("static A() 1");
X = B.Y + 1;
Console.WriteLine("static A() 2");
}
}
class B
{
public static int Y = A.X + 1; //③ 调用了A的静态成员,
// 转到A的静态构造函数---->
static B() //② 如果带有初始值设定项的静态字段,
// 执行该类的静态构造函数时,
// 先要按照文本顺序执行那些初始值设定项。
// 转到初始值设定项---->
{
Console.WriteLine("static B()");
}
static void Main() //① 程序入口,
// 如果类中包含用来开始执行的 Main 方法,
// 该类的静态构造函数将在调用 Main 方法之前执行。
// 转到B的静态构造函数---->
{
Console.WriteLine("main");
Console.WriteLine("X = {0}, Y = {1}", A.X, B.Y);//⑤ 输出结果
Console.ReadLine();
}
}该了下输出结果:
static A() 1
static A() 2
static B()
main
X = 1, Y = 2
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
TestConstructor test = new TestConstructor();
// TestConstructor test;
Console.ReadLine();
}public class TestConstructor
{ static TestConstructor()
{
Console.WriteLine("static");
} internal TestConstructor()
{
Console.WriteLine("internal");
} internal void test()
{}// static void test()
// {}
}
}一下的来自google搜索:
静态构造函数是实现对一个类进行初始化的方法成员。它一般用于对静态数据的初始化。静态构造函数不能有参数,不能有修饰符而且不能被调用,当类被加载时,类的静态构造函数自动被调用。如:using System.Data;
class Employee
{
private static DataSet ds;
static Employee()
{
ds = new DataSet(...);
}
...
} 声明了一个有静态构造函数的类Employee。注意静态构造函数只能对静态数据成员进行初始化,而不能对非静态数据成员进行初始化。但是,非静态构造函数既可以对静态数据成员赋值,也可以对非静态数据成员进行初始化。 如果类仅包含静态成员,你可以创建一个private的构造函数:private TestClass() {…},但是private意味着从类的外面不可能访问该构造函数。所以,它不能被调用,且没有对象可以被该类定义实例化。对于上文的最后一点,我又试了一下。并发现,静态的构造函数在第一次对任意静态成员赋值时被调用。
class Class1
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main(string[] args)
{
Console.WriteLine("Will give A value");
TestPrivateStatic.a = 3;
Console.WriteLine("Done");
TestPrivateStatic.a = 4;
Console.ReadLine();
}public class TestPrivateStatic
{
public static int a; static TestPrivateStatic()
{
a = 2;
Console.WriteLine("a has been given value");
}
}
}就这样了,平时总会发现一些细小的东西,没记下来真是一种损失,现在来弥补。