PS:注释和讲解部分在代码中
1. Object类
问题提出:你实现了一个只有Print()这唯一方法的类,然后在实例化对象时发现了一个诡异的问题:
为什么多出了这么多我并没有定义的方法?
这是因为在C#中存在一个Object类,它是所有类的父类,所有的类都直接或者间接继承自Object类
VS跳转入Object类的方法:
选中object变量按F12即可
结果如下:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace C4_程序设计
{
class Text
{
string name;
public Text(string name)
{
this.name = name;
}
public void Print()
{
Console.WriteLine(name);
}
public override string ToString() //可以重写Object类中的ToString()函数以方便测试
{
return string.Format("My name is {0}!", name);
//return base.ToString();
}
}
class Object类
{
static void Main()
{
Text me = new Text("hautcds");
Console.WriteLine(me.ToString()); //如果不重写ToString()函数,输出结果为:C4_程序设计.Text
//实际输出结果:My name is hautcds!
//装箱与拆箱:
//装箱:值类型-->引用类型
//拆箱:引用类型-->值类型
//装箱和拆箱本质上是数据存储在栈空间与堆空间之间变更(因此频繁的装箱或拆箱会降低代所以代码中尽量少用装箱或拆箱操作)
Object B = new Object(); //注意区分Object和object,Object是个类,而object是个类型,object是Object的一个别称
int a = 12;
Console.WriteLine(a);
object b = a; //装箱操作:值类型-->引用类型
Console.WriteLine(b);
a = (int)b; //拆箱操作:引用类型-->值类型
Console.WriteLine(a);
//以上输出结果都是12
}
}
}
2. 装箱与拆箱
- 装箱:值类型-->引用类型
- 拆箱:引用类型-->值类型
装箱和拆箱本质上是数据存储在栈空间与堆空间之间变更(因此频繁的装箱或拆箱会降低代所以代码中尽量少用装箱或拆箱操作),代码如上