对于任何类型的框类都又如下的形。 //------------------------------------------------------ class t_point { t x,y; t_point(t x,y) { this.x=x; this.y=y } } //-------------------------------------------------------- class test{ class point { public int x, y; public point(int x, int y) { this.x = x; this.y = y; } }
public static void main() { point p = new point(10, 10); object f = p; p.x = 20; console.write(((point)f).x); console.write(p.x); } }
让我么来看一看最后的结果是什么?很奇怪吗,结果是20,20.在第二次指定变量后,p 和 f 指向同一对象。这意味着修改 p 的名称也将改变 f 的名称,因为它们引用同一实例。修改类值的成员称为“变更者”,而不具有任何变更者的类称为不可变类。不可变类的存在可以使类的行为类似于值类,但不能写入为值类。
int i = 123; object k = i;// 将 int i 加框到对象 k 中 int j=(int)k; // 解框 k 到 value2
当赋值给 k 时,作为赋值的一部分,c# 编译器将创建足够容纳堆中 int 的引用类型包装,将值复制到该加框,然后将加框标记为实际类型,以便运行时了解加框的类型。要从加框中取值,必须使用强制类型装换来指定加框的类型(对象能够保留任何类型)。在执行过程中,运行时将检查对象变量引用的类型是否为强制类型转换 中指定的类型。如果类型正确,值将从加框中复制回值类型变量。如果类型不正确,将导致异常。请注意解除加框过程中不会进行其他转换;类型必须完全匹配。
请注意以下代码:
long i = 123; object k = i;// 将 long i 加框到对象 k 中 ulong j=(ulong)k;