1 封箱和拆箱
封箱(boxing)是把值类型转换为System.Object类型,或者转换为由值类型实现的接口类型。拆箱(unboxing)是相反的过程。
封箱:
struct myStruct
{
public int Val;
}
把结构放在object类型的变量中,以封箱
myStruct valtype1 = new myStruct();
valtype1.Val = 5;
object.refType = valType1;
拆箱:
valType1.Val = 6;
myStruct valType2 = (myStruct)refType;
Console.WriteLine("valtype2.Val = {0}",valType2.Val);
输出结果:
valType2.Val = 5;
注意:如果修改上面结构体为类类型
class myStruct
{
public int Val;
}
就会出现下面的输出结果:
valType2.Val = 6;
也可以把值类型封装到一个接口类型中,只有他们实现这个接口就行。
interface IMyInterface
{
}
struct myStruct : IMyInterface
{
public int Val;
}
接着把结构封装到一个IMyInterface类型中
myStruct valType1 = new myStruct();
IMyInterface refType = valType1;
然后用一般的数据类型转换语法拆箱他
myStruct valType2 = (myStruct)refType;
2 is运算符
<operand> is <type>
3 值比较
3.1 运算符重载(operator overloading)
要重载运算符,可给类添加运算符类型成员(他们必须是static)。一些运算符有多种用途,因此我们还指定了要处理多少个操作数,以及这些操作数的类型。一般情况下,操作数的类型与定义运算符的类相同,但也可以定义处理混合类型的运算符。
实例:
public class AddClass1
{
public int val;
public static AddClass1 operator + (AddClass1 op1,AddClass1 op2)
{
AddClass1 returnVal = new AddClass1();
returnVal.val = op1.val + op2.val;
return returnVal;
}
}
重载所有的二元运算符都是一样的,一元运算符看起来也是类似的,只有一个参数。