示例如下:
using System;
namespace Test
{
class Test
{
public string Data;
public override string ToString()
{
return "Test String";
}
[STAThread]
static void Main(string[] args)
{
Test t=new Test();
Console.WriteLine("tString:"+t);
string a=2.ToString();
string b=t.ToString();
Test ta=new Test();
Test tc=ta;
ta.Data="Data String";
Test tb=(Test)ta.MemberwiseClone();
if (a.Equals("2") )
Console.WriteLine("a="+a);
if (ta.Equals(tc) )
Console.WriteLine("ta=tc");
if(ta.Equals(tb) ) Console.WriteLine("ta=tb");
Console.WriteLine("taData:"+ta.Data);
Console.WriteLine("tbData:"+tb.Data);
}
}
}
运行结果:
tString:Test String
a=2
ta=tc
taData:Data String
tbData:Data String
上面的例子中我们使用了值类型2和引用类型Test的ToString方法, 你会发现我们重写了Test类的ToString方法, 如果不重写这个方法, 那么t的ToString方法将输出“Test.Test", 这是Test类带有命名空间的完整类名。上面我们还定义了Test的ta、tb、tc三个对象, 要注意这三个对象的区别。我们将ta赋值给tc, 那么tc和ta所引用的是同一个实例, 所以你在下面使用Equals方法比较这两个对象时,结果是相等的。对于MemberwiseClone方法, 类似于Java中Object基类的Clone(克隆) 方法,此方法会自动创建一个新的对象实例,并把当前对象数据成员的数据全部拷贝进新的对象,所以ta和tb里面的数据是相等的,但它们在内存中对应两个不同的实例,所以本质上是不相等的。另外,“克隆”方法虽然不是object类的方法, 但它几乎是所有引用类型的基方法,你可以重写或直接使用该方法来创建某个对象实例的副本,在某些情况下这种做法用处很大。同时, 由于object类是所有类型的基类, 所以所有类型都可以向该基类对象隐式转换, 如:
object obj=2.1;
obj=new int[5];
obj=new Person();
obj=new Car();
Car t=(Car) obj;
从上面的例子中你可以看出两个问题, 一是你可以通过object对象来引用所有引用类型的对象实例,二是我们可以通过object作为桥梁来建立引用类型和值类型的转换关系。对于object来说,最常用的是作为值类型和引用类型之间转换的桥梁。当把值类型转换为引用类型时被称为装箱,当把引用类型转换为值类型时我们称之为拆箱(这是C#里对装箱和拆箱的定义, 一般使用object这个引用类型作为箱子) 。装箱是隐式转换的,而拆箱是需要强制转换的,如:
object o=2;//装箱
int n=(int)o; //拆箱
我们可以使用装箱和拆箱完成一些不可思议的操作,比如下面这个方法可以进行任何常用格式两个数的求和计算并返回double类型的结果:
class Test
{
public static double ADD(object ox, object oy)
{
double x=(double)ox;
double y=(double)oy;
return x+y;
}
[STAThread]
static void Main(string[] args)
{
double r;
r=ADD(1,2);
r=ADD(1.1, 2.2);
r=ADD("1", "2");
r=ADD("1", 2.2);
}
}
上面这个例子中, ADD方法的两个参数类型都为object类型, 当调用时值类型转换为object类型,当方法执行计算时, 把object里面的数据拆箱出来计算。仔细分析, 你会发现装箱和拆箱操作的确很像现实生活中的装箱子和拆箱子操作, 你可以把object比作箱子, 它用来作为数据传递的载体。装箱是为了数据传输,比如日本人把钢铁、橡胶等原材料装进集装箱运回日本,拆箱是为了使用里面的数据,比如日本人利用箱子里面的原材料生产汽车和轮船。
is运算符—— 检查某个对象是否与给定类型兼容
检查某个对象是否与给定类型兼容,兼容是指是该类型或是派生于该类型的子类型,如果与给定类型兼容则返回true, 如果不兼容则返回false, 示例如下:
class Test
{
static void Main()
{
Test obj=new Test();
if(obj is Test)
{
Console.WriteLine("是Test类型");
}
if(obj is object)
{
Console.WriteLine("是object类型");
}
}
}
运行结果:
是Test类型
是object类型
}
[STAThread]
static void Main(string[] args)
{
Test t=new Test();
Console.WriteLine("tString:"+t);
string a=2.ToString();
string b=t.ToString();
Test ta=new Test();
Test tc=ta;
ta.Data="Data String";
Test tb=(Test)ta.MemberwiseClone();
if (a.Equals("2") )
Console.WriteLine("a="+a);
if (ta.Equals(tc) )
Console.WriteLine("ta=tc");
if(ta.Equals(tb) ) Console.WriteLine("ta=tb");
Console.WriteLine("taData:"+ta.Data);
Console.WriteLine("tbData:"+tb.Data);
}
}
}
运行结果:
tString:Test String
a=2
ta=tc
taData:Data String
tbData:Data String
上面的例子中我们使用了值类型2和引用类型Test的ToString方法, 你会发现我们重写了Test类的ToString方法, 如果不重写这个方法, 那么t的ToString方法将输出“Test.Test", 这是Test类带有命名空间的完整类名。上面我们还定义了Test的ta、tb、tc三个对象, 要注意这三个对象的区别。我们将ta赋值给tc, 那么tc和ta所引用的是同一个实例, 所以你在下面使用Equals方法比较这两个对象时,结果是相等的。对于MemberwiseClone方法, 类似于Java中Object基类的Clone(克隆) 方法,此方法会自动创建一个新的对象实例,并把当前对象数据成员的数据全部拷贝进新的对象,所以ta和tb里面的数据是相等的,但它们在内存中对应两个不同的实例,所以本质上是不相等的。另外,“克隆”方法虽然不是object类的方法, 但它几乎是所有引用类型的基方法,你可以重写或直接使用该方法来创建某个对象实例的副本,在某些情况下这种做法用处很大。同时, 由于object类是所有类型的基类, 所以所有类型都可以向该基类对象隐式转换, 如:
object obj=2.1;
obj=new int[5];
obj=new Person();
obj=new Car();
Car t=(Car) obj;
从上面的例子中你可以看出两个问题, 一是你可以通过object对象来引用所有引用类型的对象实例,二是我们可以通过object作为桥梁来建立引用类型和值类型的转换关系。对于object来说,最常用的是作为值类型和引用类型之间转换的桥梁。当把值类型转换为引用类型时被称为装箱,当把引用类型转换为值类型时我们称之为拆箱(这是C#里对装箱和拆箱的定义, 一般使用object这个引用类型作为箱子) 。装箱是隐式转换的,而拆箱是需要强制转换的,如:
object o=2;//装箱
int n=(int)o; //拆箱
我们可以使用装箱和拆箱完成一些不可思议的操作,比如下面这个方法可以进行任何常用格式两个数的求和计算并返回double类型的结果:
class Test
{
public static double ADD(object ox, object oy)
{
double x=(double)ox;
double y=(double)oy;
return x+y;
}
[STAThread]
static void Main(string[] args)
{
double r;
r=ADD(1,2);
r=ADD(1.1, 2.2);
r=ADD("1", "2");
r=ADD("1", 2.2);
}
}
上面这个例子中, ADD方法的两个参数类型都为object类型, 当调用时值类型转换为object类型,当方法执行计算时, 把object里面的数据拆箱出来计算。仔细分析, 你会发现装箱和拆箱操作的确很像现实生活中的装箱子和拆箱子操作, 你可以把object比作箱子, 它用来作为数据传递的载体。装箱是为了数据传输,比如日本人把钢铁、橡胶等原材料装进集装箱运回日本,拆箱是为了使用里面的数据,比如日本人利用箱子里面的原材料生产汽车和轮船。
is运算符—— 检查某个对象是否与给定类型兼容
检查某个对象是否与给定类型兼容,兼容是指是该类型或是派生于该类型的子类型,如果与给定类型兼容则返回true, 如果不兼容则返回false, 示例如下:
class Test
{
static void Main()
{
Test obj=new Test();
if(obj is Test)
{
Console.WriteLine("是Test类型");
}
if(obj is object)
{
Console.WriteLine("是object类型");
}
}
}
运行结果:
是Test类型
是object类型
示例如下:
using System;
namespace Test
{
class Test
{
public string Data;
public override string ToString()
{
return "Test String";
}
[STAThread]
static void Main(string[] args)
{
Test t=new Test();
Console.WriteLine("tString:"+t);
string a=2.ToString();
string b=t.ToString();
Test ta=new Test();
Test tc=ta;
ta.Data="Data String";
Test tb=(Test)ta.MemberwiseClone();
if (a.Equals("2") )
Console.WriteLine("a="+a);
if (ta.Equals(tc) )
Console.WriteLine("ta=tc");
if(ta.Equals(tb) ) Console.WriteLine("ta=tb");
Console.WriteLine("taData:"+ta.Data);
Console.WriteLine("tbData:"+tb.Data);
}
}
}
运行结果:
tString:Test String
a=2
ta=tc
taData:Data String
tbData:Data String
上面的例子中我们使用了值类型2和引用类型Test的ToString方法, 你会发现我们重写了Test类的ToString方法, 如果不重写这个方法, 那么t的ToString方法将输出“Test.Test", 这是Test类带有命名空间的完整类名。上面我们还定义了Test的ta、tb、tc三个对象, 要注意这三个对象的区别。我们将ta赋值给tc, 那么tc和ta所引用的是同一个实例, 所以你在下面使用Equals方法比较这两个对象时,结果是相等的。对于MemberwiseClone方法, 类似于Java中Object基类的Clone(克隆) 方法,此方法会自动创建一个新的对象实例,并把当前对象数据成员的数据全部拷贝进新的对象,所以ta和tb里面的数据是相等的,但它们在内存中对应两个不同的实例,所以本质上是不相等的。另外,“克隆”方法虽然不是object类的方法, 但它几乎是所有引用类型的基方法,你可以重写或直接使用该方法来创建某个对象实例的副本,在某些情况下这种做法用处很大。同时, 由于object类是所有类型的基类, 所以所有类型都可以向该基类对象隐式转换, 如:
object obj=2.1;
obj=new int[5];
obj=new Person();
obj=new Car();
Car t=(Car) obj;
从上面的例子中你可以看出两个问题, 一是你可以通过object对象来引用所有引用类型的对象实例,二是我们可以通过object作为桥梁来建立引用类型和值类型的转换关系。对于object来说,最常用的是作为值类型和引用类型之间转换的桥梁。当把值类型转换为引用类型时被称为装箱,当把引用类型转换为值类型时我们称之为拆箱(这是C#里对装箱和拆箱的定义, 一般使用object这个引用类型作为箱子) 。装箱是隐式转换的,而拆箱是需要强制转换的,如:
object o=2;//装箱
int n=(int)o; //拆箱
我们可以使用装箱和拆箱完成一些不可思议的操作,比如下面这个方法可以进行任何常用格式两个数的求和计算并返回double类型的结果:
class Test
{
public static double ADD(object ox, object oy)
{
double x=(double)ox;
double y=(double)oy;
return x+y;
}
[STAThread]
static void Main(string[] args)
{
double r;
r=ADD(1,2);
r=ADD(1.1, 2.2);
r=ADD("1", "2");
r=ADD("1", 2.2);
}
}
上面这个例子中, ADD方法的两个参数类型都为object类型, 当调用时值类型转换为object类型,当方法执行计算时, 把object里面的数据拆箱出来计算。仔细分析, 你会发现装箱和拆箱操作的确很像现实生活中的装箱子和拆箱子操作, 你可以把object比作箱子, 它用来作为数据传递的载体。装箱是为了数据传输,比如日本人把钢铁、橡胶等原材料装进集装箱运回日本,拆箱是为了使用里面的数据,比如日本人利用箱子里面的原材料生产汽车和轮船。
is运算符—— 检查某个对象是否与给定类型兼容
检查某个对象是否与给定类型兼容,兼容是指是该类型或是派生于该类型的子类型,如果与给定类型兼容则返回true, 如果不兼容则返回false, 示例如下:
class Test
{
static void Main()
{
Test obj=new Test();
if(obj is Test)
{
Console.WriteLine("是Test类型");
}
if(obj is object)
{
Console.WriteLine("是object类型");
}
}
}
运行结果:
是Test类型
是object类型