【黑马程序员】引用类型学习中的小问题解答
2013-04-23 13:03
393 查看
------- WindowsPhone 7手机开发、.Net培训、期待与您交流! -------
解决方案:
参数分为: 1. 值参数 2.引用参数
A.值参数在传递时,首先把参数中的值复制一份,存储在栈中。(int类型其实应该不在堆中的,这里不用管)
如下:
3 天前 上传
下载附件
(17.38 KB)
可以看到,他们的内存地址是不同的,栈里的内存会在方法退出时被自动释放。
回头看你的代码:
XInt obj = new XInt();
复制代码
虽然 obj 是一个引用类型变量,你用new Xint()创建一个类时,obj中保存了这个类在内存中的地址,但调用 public static void MethodA(XInt alias) 时,obj保存的“地址” 将复制给了 alias 变量!!!!(注意obj和alias)
这个时候如果这样操作:alias.iField+= 5 确实是修改的主函数的 obj 。
但如果执行如下代码:
XInt inner = new XInt();
inner.iField = 5;
alias = inner;
复制代码
虽然修改了 alias 指向 inner ,而且这时假设不退出,访问alias.iField的值,也确实是5, 但别忘记,alias是值参数,是复制而来的,是在栈中开辟的一块内存保存,方法结束时alias的内存被释放,好像下面的这个样子:
3 天前 上传
下载附件
(22.91 KB)
MethodA
{
}
执行到大括号结束时,系统会释放横线上面的内存区域。
---------------------------------------------------------------------------------------------------
假设采用引用传递,这时候,C#将不会复制obj的值,而会直接使用的原来的地址。现在修改了obj中的"地址",就相当于让obj指向了新的地方~!!!
3 天前 上传
下载附件
(39.34 KB)
3 天前 上传
下载附件
(47.63 KB)
public class XInt { //定义字段 public int iField = 2; } public class Starter { /// <summary> /// 引用类型按引用传递会发生什么呢?函数接受局部引用而不是别名。首先,其中一个引用时按值传递的,在被调用函数中,该参数被赋予一个新实例。 /// 然而,因为引用是按值传递的,所以函数退出后,该修改就被丢失了。因此,元是引用(obj)没有改变。 /// </summary> /// <param name="alias"></param> public static void MethodA( XInt alias) { XInt inner = new XInt(); inner.iField = 5; alias = inner; } public static void MethodB(int paremeter) { paremeter += 5; } public static void MethodC(ref int i) { i += 5; } public static void MethodD(XInt xint) { xint.iField += 5; } public static void MethodE(ref XInt alias) { XInt inner = new XInt(); inner.iField = 5; alias = inner; } public static void Main() { XInt obj = new XInt(); MethodA(obj); Console.WriteLine("引用传值{0}", obj.iField);//2 int local = 2; MethodB(local); Console.WriteLine("值传递{0}", local);//2(ok) int var = 2; MethodC(ref var); Console.WriteLine("引用传值{0}", var);//7(ok) XInt xint = new XInt(); MethodD(xint); Console.WriteLine("引用传值{0}", xint.iField);//7 XInt obj1 = new XInt(); MethodA( ref obj1); Console.WriteLine("引用传值{0}", obj.iField);//5 Console.ReadKey(); } }
解决方案:
参数分为: 1. 值参数 2.引用参数
A.值参数在传递时,首先把参数中的值复制一份,存储在栈中。(int类型其实应该不在堆中的,这里不用管)
如下:
3 天前 上传
下载附件
(17.38 KB)
可以看到,他们的内存地址是不同的,栈里的内存会在方法退出时被自动释放。
回头看你的代码:
XInt obj = new XInt();
复制代码
虽然 obj 是一个引用类型变量,你用new Xint()创建一个类时,obj中保存了这个类在内存中的地址,但调用 public static void MethodA(XInt alias) 时,obj保存的“地址” 将复制给了 alias 变量!!!!(注意obj和alias)
这个时候如果这样操作:alias.iField+= 5 确实是修改的主函数的 obj 。
但如果执行如下代码:
XInt inner = new XInt();
inner.iField = 5;
alias = inner;
复制代码
虽然修改了 alias 指向 inner ,而且这时假设不退出,访问alias.iField的值,也确实是5, 但别忘记,alias是值参数,是复制而来的,是在栈中开辟的一块内存保存,方法结束时alias的内存被释放,好像下面的这个样子:
3 天前 上传
下载附件
(22.91 KB)
MethodA
{
}
执行到大括号结束时,系统会释放横线上面的内存区域。
---------------------------------------------------------------------------------------------------
假设采用引用传递,这时候,C#将不会复制obj的值,而会直接使用的原来的地址。现在修改了obj中的"地址",就相当于让obj指向了新的地方~!!!
3 天前 上传
下载附件
(39.34 KB)
3 天前 上传
下载附件
(47.63 KB)
相关文章推荐
- 黑马程序员——基础学习(七)Eclipse相关应用及引用类型问题
- 黑马程序员_学习日记37_601基础加强(enums_truct_类型转换_值类型与引用类型_异常处理_函数返回值)
- 黑马程序员_学习笔记10——引用类型与值类型,继承,访问修饰符,里氏转换
- 黑马程序员之c#学习笔记:C#值类型和引用类型区别
- 性能测试学习中的问题与解答2--参数类型
- 5. 引用类型学习笔记
- js学习笔记:基本类型和引用类型
- Android学习 之 问题&解答 ScrollView中嵌套ListView时显示不全的简便解决方案
- 函数返回值是否使用引用类型的问题:理解引用、返回值
- swift3.0 学习 fileprivate lazy var 类型问题
- 学习记录 java 值类型和引用类型的知识
- JAVA 几种引用类型学习
- 解决 命名空间中不存在类型或命名空间名称“App_Code”(是否缺少程序集引用?)的问题
- JAVA学习笔记3--类,对象,变量,方法,构造方法,this,引用类型
- javascript 学习 第8天 引用类型
- 当n非常非常大时(比如为1万),求n!问题的学习,解答和疑问。
- c#学习之值类型和引用里类型
- 《CLR Via C#》 学习心得之三 基元类型、引用类型和值类型
- 函数返回值是否使用引用类型的问题:理解引用、返回值
- C#学习笔记 3 值类型与引用类型