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

classProgram{staticvoidMain(string[]args){inti=10;Class1.Add(i);Console.WriteLine(i);... 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)第一次却没有自增,第二次才自增.
希望高手解惑.
展开
 我来答
IT168
2022-11-07 · 百度认证:IT168官方账号,优质数码领域创作者
IT168
IT168是中国最大的个人和企业IT产品选购、互动网站,每日提供最新的IT产品报价、促销行情、手机、平板、笔记本、相机和企业等50个频道提供最专业的产品选购和使用建议。
向TA提问
展开全部
(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、引用类型:复制代码。
syht2000
高粉答主

2013-08-20 · 关注我不会让你失望
知道大有可为答主
回答量:3万
采纳率:79%
帮助的人:1.5亿
展开全部
这是两个问题
第一个是按值和按引用传值的问题,凡是基础类型的数据,比如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了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百百mp3
2013-08-20 · TA获得超过855个赞
知道小有建树答主
回答量:901
采纳率:90%
帮助的人:564万
展开全部
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
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cclzc520
2013-08-20 · TA获得超过608个赞
知道答主
回答量:165
采纳率:0%
帮助的人:123万
展开全部
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));
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式