C#关于值类型与引用类型的区别

class Program
{
static void Main(string[] args)
{
int i=10;
Class1.Add(i);
Console.WriteLine(i);
Class1.Add(ref i);
Console.WriteLine(i);
Class1.Add(ref i);
Console.WriteLine(i);
double a = 2.0, b = 9.0;
Console.WriteLine(Class1.Muti(ref a,ref b));
Console.WriteLine(Class1.Muti(ref a, ref b));
}
}
class Class1
{
public static int Add(int i)
{
return i++;
}
public static int Add(ref int i)
{
return i++;
}
public static double Muti(ref double x,ref double y)
{
return x ++ * y++;
}
这是自己写的练习程序,运行结果是10 11 12 18 30.不明白函数值传导形参,用return语句也不返回++自增.另外Add(ref int i)的值,第一次运行就返回i++自增的值,而Muti(ref x,ref y)第一次却没有自增,第二次才自增.
希望高手解惑.

(1)值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据。
(2)引用类型:对象、数组、函数。

1、值类型:包括:sbyte、short、int、long、float、double、decimal(以上值类型有符号)byte、ushort、uint、ulong(以上值类型无符号)bool、char
2、引用类型:包括:对象类型、动态类型、字符串类型。二、具体区别:
1、值类型:byteb1=1;byteb2=b1;Console.WriteLine("{0},{1}。",b1,b2);b2=
2;Console.WriteLine("{0},{1}。",b1,b2);Console.ReadKey();解释:byteb1=1;声明b1时,在栈内开辟一个内存空间保存b1的值1。byteb2=b1;声明b2时,在栈内开辟一个内存空间保存b1赋给b2的值1。Console.WriteLine("{0},{1}。",b1,b2);输出结果为1,1。b2=2;将b2在栈中保存的值1改为
2。Console.WriteLine("{0},{1}。",b1,b2);输出结果为1,2。
2、引用类型:复制代码。
温馨提示:答案为网友推荐,仅供参考
第1个回答  2013-08-20
这是两个问题
第一个是按值和按引用传值的问题,凡是基础类型的数据,比如int或者double等等或者struct之类的,默认都是按值传参,而象带有out 、ref或者参数就是自定义类,则是按引用传参,所以最前面的Class1.Add(i);,只是按值传参,你add中的i的变化是不会影响到main中的那个i的。所以结果就是10,至于那个Class1.Add(ref i)则刚好相反,add中的i变化为多少,main中那个i也会做相同变化。

第二个问题至于那个Muti(ref x,ref y)第一次值没变化,是因为你用的是x++,这个运算符是先使用再增加,也就是当eturn x ++ * y++;的时候,x和y仍然还是2和9,只有执行完这一行,x和y才会自加1,如果你改成return ++x * ++y;第一次调用Console.WriteLine(Class1.Muti(ref a,ref b));的时候就会输出30了。
第2个回答  2013-08-20
i++返回的是i,++i返回的是i+1(比较类似就近原则= =),它们返回的结果是不一样的,实际上它们的值都加1了
ref是直接使用地址操作,调用Class1_Muti(ref a, ref b)时,改的就是a,b,而Class1_Muti(a, b)改的是a,b的【副本】,这就是不同点(这就是为什么ref会快的原因)。所以Class1_Add(i);返回的是i(即10)。
虽然修改的是副本,但最后还是会赋值给原变量的,所以第一次执行Add(int),之后Add(ref int),结果也会不同。
第一次执行Class1.Muti(ref a,ref b)时,返回的是
return x ++ * y++; 也就是return a++ * b++;
a++返回的是a本身的值2.0实质上a已经+1,即a = 3.0
b++返回的是b本身的值9.0实质上b已经+1,即b = 10.0
a++ * b++ => 2.0 * 9.0 => 18.0
之后再调用:
a++返回的是a本身的值3.0实质上a已经+1,即a = 4.0
b++返回的是b本身的值10.0实质上b已经+1,即b = 11.0
a++ * b++ => 3.0 * 10.0 => 30.0本回答被提问者采纳
第3个回答  2013-08-20
int i=10;Class1.Add(i);Console.WriteLine(i);
//这两行代码不用多解释。运行方法Class.Add(i),并没有将返回值重新赋值给i. 即使赋值给i .
//i  的输出值仍然是10.  因为该方法返回的是 return i++; 而不是 return ++i;
i++; ++i 应该不用多解释吧。

//i 的初始值仍然是10。另外增加一个变量 i2
int i2 =0;


i2 = Class1.Add(ref i);此方法返回值是多少? 答案是10。return ++i 实际上是返回运算之前的值。++i才是返回运算后的值。
Console.WriteLine(i);

//i的值已经是11了。
 Class1.Add(ref i); //此方法返回值为11.但是i++之后,i=12,这也就是输出的时候为什么是12
 Console.WriteLine(i);

 //看懂上面的。下面的不用解释了吧
double a = 2.0, b = 9.0;
Console.WriteLine(Class1.Muti(ref a,ref b));
Console.WriteLine(Class1.Muti(ref a, ref b));

相似回答