1、 有个学生问个知识点,题目如下:
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Testclass.a);
Console.WriteLine(Testclass.b);
}
}
class Testclass
{
public static int a = b + 1;
public static int b = a + 1;
}
问,输出
a和b的结果是什么?
初一看,这个字段是递归的,
a和b相互赋值,可能编译或运行时要报错。
其实,结果是不但编译通过,运行不报错,还得得到
a为1,b为2的结果。因为上面代码的样子迷糊乎了我们。
真正的原因在于静态字段的出现。如果类中有静态字段,该类会自动生成静态类,并把静态字段的初始化工作放到类中去实现,这样的话,上面的代码就转成这个样子了。
class Program
{
static void Main(string[] args)
{
Console.WriteLine(Testclass.a);
Console.WriteLine(Testclass.b);
}
}
class Testclass
{
public static int a;
public static int b;
static Testclass()
{
a = b + 1;
b = a + 1;
}
}
这样的话,初始状态下,
a,b都为0,当调用Testclass.a时,其实就是用0+1去给a赋值,当调用Testclass.b时,b=1+1,结果就为2。
2、 ToString的打印
有如下代码:
class Program
{
static void Main(string[] args)
{
Testclass tc=new Testclass ();
Console.WriteLine(tc);
}
}
class Testclass
{
string name="无名氏
";
string sex = "男
";
public override string ToString()
{
return "姓名:
" + name + " 性别:" + sex;
}
}
运行地果是:“姓名:无名氏
性别:男”
如果在
Testclass中不去重载ToString,则,运行结果为:TowDemo.Testclass
后面的运行结果可以理解,前面的运行结果能把
ToString方法转化成对象呢?苦思不得其解呀。
后来想,为什么对象的输出,每次都是输出类型呢?
这就要看
Console.WriteLine了,用反射工具,因为对象不在在19中重载中,最符合的就是object了,就查看WriteLine(Object)方法,结果为:
{
}
再寻找
Out.WriteLine方法,结果如下:
{
if (value == null)
{
this.
WriteLine();
}
else
{
if (formattable != null)
{
}
else
{
}
}
}
不难看出,是调用对象的
ToString打印的。
现在已经解决我们的问题了,原来是
Console.WriteLine的问题,它输入的是对象的ToString,这就符合逻辑了。
但没有重载的为什么输出对象呢?
我们知道,所有的对象,对继承自
Object,子类中调用Object,因为没有重载,所以调用的将是父类(即Object)的ToString()方法。那Object的ToString方法什么样子呢?
public virtual
string
ToString()
{
}
|
这样,就把整个问题解决了,不重载是调用
Object的ToString,重载后调用自身的ToString,这些都是Console.WriteLine这个方法的特点。不是ToString的问题。
本文转自桂素伟51CTO博客,原文链接: http://blog.51cto.com/axzxs/384904
,如需转载请自行联系原作者