请教2道C#试题

来源:百度知道 编辑:UC知道 时间:2024/06/09 04:34:29
using System;
class A
{
public static int X;
static A(){
X=B.Y+1;
}
}
class B
{
public static int Y=A.X+1;
static B(){}
static void Main(){
Console.WriteLine("X={0},Y={1}",A.X,B.Y);
}
}

为什么这题输出是 1和2

下面这题看不懂说明下
6.下面这段代码输出什么?为什么?
int i=5;
int j=5;
if (Object.ReferenceEquals(i,j))
Console.WriteLine("Equal");
else
Console.WriteLine("Not Equ")
第一题输出是 1和2 代码没错我试过的

静态构造函数(如 static A(){})的作用是用来初始化静态成员的,有意思的是静态构造函数会在类实例创建或静态成员被引用前自动调用,而且这种调用只发生一次。
所以
1) Console.WriteLine("X={0},Y={1}",A.X,B.Y);这句中:
2) A.X激发了static A(),在static A()中出现了B.Y;从而又激发了static B(),然而static B()中并没有执行任何操作,这时B.Y的值会是0,而不是想象中的1或2
3) 从而1) 中A.X最终为1
4) 进而1) 中B.Y最终为2
LZ可以在static A() B()中添加输出语句查看

第二个问题自然是"Not Equ", 这里ReferenceEquals比较的是i,j是否为同一实例。i,j显然是两个不同的实例(尽管他们的值相同)。
再加点:int i=5 的写法相当于 int i=new int();i=5;
i是比较特殊的实例

小弟只能解释下第二题了:
ReferenceEquals它会根据需要自动进行必要的类型转换,并根据两个对象的值是否相等返回true或者false。
Equals方法对于值类型和引用类型的定义不同,对于值类型,类型相同,并且数值相同(对于struct的每个成员都必须相同),则Equals返回true,否则返回false。而对于引用类型,默认的行为与ReferenceEquals的行为相同,仅有两个对象指向同一个Reference的时候才返回true。可以根据需要对Equals进行重载,例如String类的Equals用于判断两个字符串的内容是否相等
这题的i,j应该是值类型,上面应该用Equals方法比较,返回的值才为true

1.定义成了静态变量
2.确定指定的i,j实例是否是相同的实例.相同为真,不相同为假

第一个题中:由于X被定义为了静态变量,初始化的默认值是为0,如果是一班的变量,那么程序在编译时会报错的。
第二题中为 Not Equ 该题中Reference为引用,相当于地址,并不是比较这两的值是