问题:要求定义一个方法,接受一个int类型参数,要求方法返回后作为实参传递进来的变量值增加1。
思考一番 这还不简单,一顿操作:
public static void point(int N)
{
N++;
}
结果发现不对 x的值没有变
int a = 1;
point(a);
Console.WriteLine(a);//结果是1
这时我就想 如果有这样一个类:
class plus
{
private int n;
public int N { get { return n; }set { n = value; } }
}
现在要定义一个方法,用方法形参接受这个plus类型的参数 然后给他的N加1:
public static void point1(plus p)
{
p.N++;
}
然后在主方法内调用:
plus p = new plus();
p.N = 1;
point1( p);
Console.WriteLine(p.N );//结果是2
N竟然变了 这就是引用类型与值类型的区别。
当变量相互赋值时,值类型的变量直接拷贝了一份值。当变量离开作用域,就会从栈上弹出来。
而引用类型不会在堆中构造一个新的对象,而是只复制引用(当然另有方法可以拷贝一个新对象),使得被赋值的变量引用同一个对象。即使某个引用类型变量离开作用域不能被使用,但是堆中的对象不一定马上就被销毁了,因为有可能还有其他变量引用
1.值类型变量在作用域内结束时 系统会自动释放 ;而引用类型则靠GC
2.继承不同 值类型继承于value Type而valueType 继承于System.object 引用继承于System.object